searx_space_instances.json 13 KB

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