searx_space_instances.json 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. {
  2. "title": "SearXNG instances",
  3. "description": "Unofficial schema draft for /data/instances.json from the searx-space project, see https://github.com/searxng/searx-space or https://searx.space",
  4. "$defs": {
  5. "ip_metadata": {
  6. "description": "IP-address metadata",
  7. "type": "object",
  8. "properties": {
  9. "reverse": {
  10. "oneOf": [
  11. {
  12. "type": "string"
  13. },
  14. {
  15. "type": "null"
  16. }
  17. ]
  18. },
  19. "field_type": {
  20. "description": "DNS record type",
  21. "type": "string",
  22. "minLength": 1,
  23. "maxLength": 10
  24. },
  25. "asn_cidr": {
  26. "$ref": "#/$defs/netmask"
  27. }
  28. }
  29. },
  30. "ipaddress": {
  31. "description": "IPv4 or IPv6 address",
  32. "anyOf": [
  33. {
  34. "type": "string",
  35. "description": "IPv4 address",
  36. "format": "ipv4"
  37. },
  38. {
  39. "type": "string",
  40. "description": "IPv6 address",
  41. "format": "ipv6"
  42. }
  43. ]
  44. },
  45. "netmask": {
  46. "description": "IPv4 or IPv6 netmask",
  47. "oneOf": [
  48. {
  49. "description": "IPv4 netmask",
  50. "type": "string",
  51. "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/[0-9]{1,2}$"
  52. },
  53. {
  54. "description": "IPv6 netmask",
  55. "type": "string",
  56. "pattern": "^(([A-Fa-f0-9]{1,4}:){1,8}):/([0-9]|[1-9][0-9]|1[01][0-9]|12[0-8])$"
  57. }
  58. ]
  59. },
  60. "ips": {
  61. "type": "object",
  62. "propertyNames": {
  63. "$ref": "#/$defs/ipaddress"
  64. },
  65. "additionalProperties": {
  66. "$ref": "#/$defs/ip_metadata"
  67. }
  68. },
  69. "ipv6": {
  70. "description": "IPv6 support",
  71. "oneOf": [
  72. {"type": "boolean"},
  73. {"type": "null"}
  74. ]
  75. },
  76. "grade": {
  77. "oneOf": [
  78. {
  79. "type": "string",
  80. "pattern": "([A-F]|\\?)(\\+)?"
  81. },
  82. {
  83. "type": "boolean"
  84. },
  85. {
  86. "type": "null"
  87. }
  88. ]
  89. },
  90. "gradeUrl": {
  91. "type": "string",
  92. "format": "uri"
  93. },
  94. "timingItem": {
  95. "type": "object",
  96. "properties": {
  97. "median": {"type": "number"},
  98. "stdev": {"type": "number"},
  99. "value": {"type": "number"},
  100. "mean": {"type": "number"}
  101. }
  102. },
  103. "timings": {
  104. "type": "object",
  105. "properties": {
  106. "success_percentage": {
  107. "type": "number"
  108. },
  109. "all": {"$ref": "#/$defs/timingItem"},
  110. "server": {"$ref": "#/$defs/timingItem"},
  111. "load": {"$ref": "#/$defs/timingItem"},
  112. "error": {"type": "string"}
  113. }
  114. },
  115. "ressourcesItem": {
  116. "type": "object",
  117. "propertyNames": {
  118. "format": "uri"
  119. },
  120. "additionalProperties": {
  121. "type": "object",
  122. "properties": {
  123. "hashRef": {
  124. "type": "number",
  125. "minimum": 0,
  126. "maximum": 100
  127. }
  128. }
  129. }
  130. },
  131. "uptimeItem": {
  132. "type": "number",
  133. "minimum": 0,
  134. "maximum": 100
  135. },
  136. "statsItem": {
  137. "anyOf": [
  138. {
  139. "type": "number",
  140. "minimum": 0.0,
  141. "maximum": 100.0
  142. },
  143. {"type": "null"}
  144. ]
  145. }
  146. },
  147. "type": "object",
  148. "properties": {
  149. "metadata": {
  150. "type": "object",
  151. "properties": {
  152. "timestamp": {"type": "number"},
  153. "ips": {"$ref": "#/$defs/ips"},
  154. "ipv6": {"$ref": "#/$defs/ipv6"}
  155. }
  156. },
  157. "instances": {
  158. "type": "object",
  159. "description": "Object holding data of SearXNG instances",
  160. "propertyNames": {
  161. "format": "uri"
  162. },
  163. "additionalProperties": {
  164. "type": "object",
  165. "properties": {
  166. "analytics": {"type": "boolean"},
  167. "comments": {
  168. "type": "array",
  169. "items": {
  170. "type": "string"
  171. }
  172. },
  173. "alternativeUrls": {
  174. "description": "Alternative URLs",
  175. "type": "object",
  176. "propertyNames": {
  177. "type": "string",
  178. "description": "Alternative URL",
  179. "format": "uri"
  180. },
  181. "additionalProperties": {
  182. "type": "string",
  183. "description": "Comment",
  184. "maxLength": 1024
  185. }
  186. },
  187. "docs_url": {
  188. "oneOf": [
  189. {"type": "string", "format": "uri"},
  190. {"type": "null"}
  191. ]
  192. },
  193. "generator": {
  194. "oneOf": [
  195. {"type": "string"},
  196. {"type": "null"}
  197. ]
  198. },
  199. "git_url": {
  200. "oneOf": [
  201. {
  202. "type": "string",
  203. "format": "uri"
  204. },
  205. {
  206. "type": "null"
  207. }
  208. ]
  209. },
  210. "http": {
  211. "type": "object",
  212. "properties": {
  213. "error": {
  214. "oneOf": [
  215. {"type": "string"},
  216. {"type": "null"}
  217. ]
  218. },
  219. "status_code": {
  220. "oneOf": [
  221. {
  222. "type": "number",
  223. "minimum": 0,
  224. "maximum": 530
  225. },
  226. {
  227. "type": "null"
  228. }
  229. ]
  230. },
  231. "grade": {
  232. "$ref": "#/$defs/grade"
  233. },
  234. "gradeUrl": {
  235. "$ref": "#/$defs/gradeUrl"
  236. }
  237. }
  238. },
  239. "contact_url": {
  240. "oneOf": [
  241. {"type": "string"},
  242. {"type": "boolean"},
  243. {"type": "null"}
  244. ]
  245. },
  246. "main": {"type": "boolean"},
  247. "network_type": {
  248. "oneOf": [
  249. {
  250. "type": "string",
  251. "enum": [
  252. "normal",
  253. "tor"
  254. ]
  255. },
  256. {"type": "null"}
  257. ]
  258. },
  259. "timing": {
  260. "type": "object",
  261. "properties": {
  262. "initial": {"$ref": "#/$defs/timings"},
  263. "search": {"$ref": "#/$defs/timings"},
  264. "search_wp": {"$ref": "#/$defs/timings"},
  265. "search_go": {"$ref": "#/$defs/timings"}
  266. }
  267. },
  268. "tls": {
  269. "type": "object",
  270. "properties": {
  271. "certificate": {
  272. "type": "object",
  273. "properties": {
  274. "OCSP": {
  275. "type": "array",
  276. "items": {
  277. "type": "string",
  278. "format": "uri"
  279. }
  280. },
  281. "caIssuers": {
  282. "type": "array",
  283. "items": {
  284. "type": "string",
  285. "format": "uri"
  286. }
  287. },
  288. "crlDistributionPoints": {
  289. "type": "array",
  290. "items": {
  291. "type": "string",
  292. "format": "uri"
  293. }
  294. },
  295. "issuer": {
  296. "type": "object",
  297. "properties": {
  298. "commonName": {
  299. "type": "string"
  300. },
  301. "countryName": {
  302. "type": "string"
  303. },
  304. "organizationName": {
  305. "type": "string"
  306. }
  307. }
  308. },
  309. "subject": {
  310. "type": "object",
  311. "properties": {
  312. "commonName": {
  313. "oneOf": [
  314. {"type": "string"},
  315. {"type": "null"}
  316. ]
  317. },
  318. "countryName": {
  319. "oneOf": [
  320. {"type": "string"},
  321. {"type": "null"}
  322. ]
  323. },
  324. "organizationName": {
  325. "oneOf": [
  326. {"type": "string"},
  327. {"type": "null"}
  328. ]
  329. },
  330. "altName": {
  331. "type": "string"
  332. }
  333. }
  334. },
  335. "notAfter": {
  336. "type": "string",
  337. "pattern": "^[0-9]+?Z$"
  338. },
  339. "notBefore": {
  340. "type": "string",
  341. "pattern": "^[0-9]+?Z$"
  342. },
  343. "serialNumber": {
  344. "type": "string",
  345. "pattern": "^[0-9A-F]{22,36}$"
  346. },
  347. "sha256": {
  348. "type": "string",
  349. "pattern": "^([0-9A-F]{2}:){31}[0-9A-F]{2}$"
  350. },
  351. "signatureAlgorithm": {
  352. "type": "string",
  353. "enum": [
  354. "sha256WithRSAEncryption",
  355. "sha384WithRSAEncryption",
  356. "ecdsa-with-SHA256",
  357. "ecdsa-with-SHA384"
  358. ]
  359. },
  360. "version": {
  361. "type": "number",
  362. "enum": [1, 2, 3]
  363. }
  364. },
  365. "additionalProperties": false
  366. },
  367. "version": {
  368. "type": "string",
  369. "enum": ["TLSv1.2", "TLSv1.3"]
  370. },
  371. "grade": {
  372. "$ref": "#/$defs/grade"
  373. },
  374. "gradeUrl": {
  375. "$ref": "#/$defs/gradeUrl"
  376. }
  377. },
  378. "additionalProperties": false
  379. },
  380. "version": {
  381. "oneOf": [
  382. {
  383. "description": "Semantic major.minor.patch version plus additions, or Date version year.month.day version plus additions",
  384. "type": "string",
  385. "pattern": "^([0-9]{1,4}\\.){2}([0-9]{1,4})(\\+[a-fA-F0-9]{1,9})?(\\+dirty)?( \\([a-fA-F0-9]{1,9}\\))?$"
  386. },
  387. {
  388. "description": "Semantic versions with - as extras seperator",
  389. "type": "string",
  390. "pattern": "^([0-9]{1,3}\\.){2}([0-9]{1,3})(-[0-9]{1,3})(-[a-fA-F0-9]{1,9})$"
  391. },
  392. {
  393. "type": "null"
  394. }
  395. ]
  396. },
  397. "html": {
  398. "description": "TODO",
  399. "type": "object",
  400. "additionalProperties": false,
  401. "properties": {
  402. "grade": {
  403. "description": "TODO look at https://searx.space/ (V=Vanilla, C=Custom, F=Fork, Cjs=Custom and custom JS)",
  404. "type": "string",
  405. "pattern": "^(A|B|C|D|E|F|V|\\?)?(js|js\\?)?(, \\?)?$"
  406. },
  407. "ressources": {
  408. "type": "object",
  409. "additionalProperties": false,
  410. "properties": {
  411. "css": {"$ref": "#/$defs/ressourcesItem"},
  412. "img": {"$ref": "#/$defs/ressourcesItem"},
  413. "link": {"$ref": "#/$defs/ressourcesItem"},
  414. "script": {"$ref": "#/$defs/ressourcesItem"},
  415. "other": {"$ref": "#/$defs/ressourcesItem"},
  416. "inline_script": {
  417. "description": "TODO Unknown",
  418. "type": "array",
  419. "items": {"type": "string"}
  420. },
  421. "inline_style": {
  422. "description": "TODO Unknown",
  423. "type": "array",
  424. "items": {"type": "string"}
  425. },
  426. "error": {
  427. "description": "TODO",
  428. "type": "string"
  429. }
  430. }
  431. }
  432. }
  433. },
  434. "engines": {
  435. "description": "TODO",
  436. "type": "object",
  437. "propertyNames": {
  438. "type": "string",
  439. "minLength": 1,
  440. "maxLength": 128
  441. },
  442. "additionalProperties": {
  443. "type": "object",
  444. "properties": {
  445. "error_rate": {
  446. "oneOf": [
  447. {
  448. "type": "number",
  449. "minimum": 0,
  450. "maximum": 100
  451. },
  452. {
  453. "type": "null"
  454. }
  455. ]
  456. },
  457. "errors": {
  458. "type": "array",
  459. "items": {
  460. "type": "number",
  461. "minimum": 0,
  462. "maximum": 100
  463. }
  464. },
  465. "checker": {
  466. "type": "object",
  467. "description": "TODO"
  468. }
  469. },
  470. "additionalProperties": false
  471. }
  472. },
  473. "uptime": {
  474. "oneOf": [
  475. {
  476. "description": "TODO",
  477. "type": "object",
  478. "properties": {
  479. "uptimeDay": {"$ref": "#/$defs/uptimeItem"},
  480. "uptimeWeek": {"$ref": "#/$defs/uptimeItem"},
  481. "uptimeMonth": {"$ref": "#/$defs/uptimeItem"},
  482. "uptimeYear": {"$ref": "#/$defs/uptimeItem"}
  483. },
  484. "additionalProperties": false
  485. },
  486. {"type": "null"}
  487. ]
  488. },
  489. "error": {
  490. "type": "string"
  491. },
  492. "network": {
  493. "description": "TODO",
  494. "type": "object",
  495. "properties": {
  496. "ips": {"$ref": "#/$defs/ips"},
  497. "ipv6": {"$ref": "#/$defs/ipv6"},
  498. "asn_privacy": {
  499. "type": "number",
  500. "enum": [-1, 0, 1]
  501. },
  502. "dnssec": {
  503. "type": "number",
  504. "enum": [0, 1, 2]
  505. }
  506. },
  507. "additionalProperties": false
  508. }
  509. },
  510. "required": ["analytics", "alternativeUrls", "comments", "git_url", "http", "network_type"],
  511. "additionalProperties": false
  512. },
  513. "minProperties": 1,
  514. "maxProperties": 4096
  515. },
  516. "engines": {
  517. "type": "object",
  518. "propertyNames": {
  519. "type": "string",
  520. "minLength": 1,
  521. "maxLength": 255
  522. },
  523. "additionalProperties": {
  524. "type": "object",
  525. "additionalProperties": false,
  526. "properties": {
  527. "categories": {
  528. "type": "array",
  529. "items": {
  530. "type": "string",
  531. "minLength": 1,
  532. "maxLength": 255
  533. }
  534. },
  535. "language_support": {"type": "boolean"},
  536. "paging": {"type": "boolean"},
  537. "safesearch": {"type": "boolean"},
  538. "time_range_support": {"type": "boolean"},
  539. "shortcut": {"type": "string", "minLength": 1, "maxLength": 32},
  540. "stats": {
  541. "type": "object",
  542. "properties": {
  543. "error_rate": {"$ref": "#/$defs/statsItem"},
  544. "instance_count": {"$ref": "#/$defs/statsItem"},
  545. "stats_count": {"$ref": "#/$defs/statsItem"}
  546. }
  547. }
  548. }
  549. }
  550. },
  551. "engine_errors": {
  552. "type": "array",
  553. "items": {
  554. "type": "string",
  555. "minLength": 1,
  556. "maxLength": 255
  557. }
  558. },
  559. "categories": {
  560. "type": "array",
  561. "items": {
  562. "type": "string",
  563. "minLength": 1,
  564. "maxLength": 255
  565. }
  566. },
  567. "hashes": {
  568. "type": "array",
  569. "items": {
  570. "type": "object",
  571. "additionalProperties": false,
  572. "properties": {
  573. "count": {"type": "number"},
  574. "hash": {
  575. "type": "string",
  576. "minLength": 1,
  577. "maxLength": 255
  578. },
  579. "forks": {
  580. "type": "array",
  581. "items": {
  582. "type": "number",
  583. "minimum": 0,
  584. "maximum": 255
  585. }
  586. },
  587. "unknown": {"type": "boolean"}
  588. }
  589. }
  590. },
  591. "cidrs": {
  592. "type": "object",
  593. "propertyNames": {
  594. "$ref": "#/$defs/netmask"
  595. },
  596. "additionalProperties": {
  597. "type": "object",
  598. "properties": {
  599. "asn": {"type": "string"},
  600. "asn_country_code": {"type": "string"},
  601. "asn_description": {"type": "string"},
  602. "asn_privacy": {"type": "number"},
  603. "network_country": {"type": "string"}
  604. }
  605. }
  606. },
  607. "forks": {
  608. "type": "array",
  609. "items": {
  610. "type": "string",
  611. "format": "uri"
  612. }
  613. }
  614. }
  615. }