├── README.md ├── app.js ├── package-lock.json ├── package.json └── views └── index.html /README.md: -------------------------------------------------------------------------------- 1 | # api-example-bored-api -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const rateLimit = require("express-rate-limit"); 3 | const app = express(); 4 | 5 | const limiter = rateLimit({ 6 | windowMs: 15 * 60 * 1000, // 15 minutes 7 | max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) 8 | standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers 9 | legacyHeaders: false, // Disable the `X-RateLimit-*` headers 10 | }); 11 | 12 | app.set("view engine", "html"); 13 | app.set("views", __dirname + "/views"); 14 | app.engine("html", require("ejs").renderFile); 15 | 16 | app.use(limiter); 17 | 18 | const data = { 19 | activities: [ 20 | { 21 | activity: "Learn Express.js", 22 | availability: 0.25, 23 | type: "education", 24 | participants: 1, 25 | price: 0.1, 26 | accessibility: "Few to no challenges", 27 | duration: "hours", 28 | kidFriendly: true, 29 | link: "https://expressjs.com/", 30 | key: "3943506", 31 | }, 32 | { 33 | activity: "Learn to greet someone in a new language", 34 | availability: 0.2, 35 | type: "education", 36 | participants: 1, 37 | price: 0.1, 38 | accessibility: "Few to no challenges", 39 | duration: "minutes", 40 | kidFriendly: true, 41 | link: "", 42 | key: "4704256", 43 | }, 44 | { 45 | activity: "Learn how to play a new sport", 46 | availability: 0.2, 47 | type: "recreational", 48 | participants: 1, 49 | price: 0.1, 50 | accessibility: "Minor challenges", 51 | duration: "minutes", 52 | kidFriendly: true, 53 | link: "", 54 | key: "5808228", 55 | }, 56 | { 57 | activity: "Text a friend you haven't talked to in a long time", 58 | availability: 0.2, 59 | type: "social", 60 | participants: 2, 61 | price: 0.05, 62 | accessibility: "Few to no challenges", 63 | duration: "minutes", 64 | kidFriendly: true, 65 | link: "", 66 | key: "6081071", 67 | }, 68 | { 69 | activity: "Learn a new programming language", 70 | availability: 0.25, 71 | type: "education", 72 | participants: 1, 73 | price: 0.1, 74 | accessibility: "Few to no challenges", 75 | duration: "hours", 76 | kidFriendly: true, 77 | link: "", 78 | key: "5881028", 79 | }, 80 | { 81 | activity: "Learn how to fold a paper crane", 82 | availability: 0.05, 83 | type: "education", 84 | participants: 1, 85 | price: 0.1, 86 | accessibility: "Minor challenges", 87 | duration: "minutes", 88 | kidFriendly: true, 89 | link: "", 90 | key: "3136036", 91 | }, 92 | { 93 | activity: "Find a DIY to do", 94 | availability: 0.3, 95 | type: "diy", 96 | participants: 1, 97 | price: 0.4, 98 | accessibility: "Few to no challenges", 99 | duration: "minutes", 100 | kidFriendly: true, 101 | link: "", 102 | key: "4981819", 103 | }, 104 | { 105 | activity: "Learn about the Golden Ratio", 106 | availability: 0.2, 107 | type: "education", 108 | participants: 1, 109 | price: 0.1, 110 | accessibility: "Few to no challenges", 111 | duration: "minutes", 112 | kidFriendly: true, 113 | link: "https://en.wikipedia.org/wiki/Golden_ratio", 114 | key: "2095681", 115 | }, 116 | { 117 | activity: "Volunteer at a local animal shelter", 118 | availability: 0.5, 119 | type: "charity", 120 | participants: 1, 121 | price: 0.1, 122 | accessibility: "Minor challenges", 123 | duration: "hours", 124 | kidFriendly: true, 125 | link: "", 126 | key: "1382389", 127 | }, 128 | { 129 | activity: "Play a game of Monopoly", 130 | availability: 0.3, 131 | type: "social", 132 | participants: 4, 133 | price: 0.2, 134 | accessibility: "Few to no challenges", 135 | duration: "hours", 136 | kidFriendly: true, 137 | link: "", 138 | key: "1408058", 139 | }, 140 | { 141 | activity: "Bake pastries for you and your neighbor", 142 | availability: 0.3, 143 | type: "cooking", 144 | participants: 1, 145 | price: 0.4, 146 | accessibility: "Minor challenges", 147 | duration: "hours", 148 | kidFriendly: true, 149 | link: "", 150 | key: "8125168", 151 | }, 152 | { 153 | activity: "Bake something you've never tried before", 154 | availability: 0.3, 155 | type: "cooking", 156 | participants: 1, 157 | price: 0.4, 158 | accessibility: "Minor challenges", 159 | duration: "hours", 160 | kidFriendly: true, 161 | link: "", 162 | key: "5665663", 163 | }, 164 | { 165 | activity: "Take your dog on a walk", 166 | availability: 0.2, 167 | type: "relaxation", 168 | participants: 1, 169 | price: 0.0, 170 | accessibility: "Few to no challenges", 171 | duration: "minutes", 172 | kidFriendly: true, 173 | link: "", 174 | key: "9318514", 175 | }, 176 | { 177 | activity: "Meditate for five minutes", 178 | availability: 0.05, 179 | type: "relaxation", 180 | participants: 1, 181 | price: 0.0, 182 | accessibility: "Few to no challenges", 183 | duration: "minutes", 184 | kidFriendly: true, 185 | link: "", 186 | key: "3699502", 187 | }, 188 | { 189 | activity: "Start a book you've never gotten around to reading", 190 | availability: 0.1, 191 | type: "relaxation", 192 | participants: 1, 193 | price: 0.1, 194 | accessibility: "Few to no challenges", 195 | duration: "minutes", 196 | kidFriendly: true, 197 | link: "", 198 | key: "7114122", 199 | }, 200 | { 201 | activity: "Take a caffeine nap", 202 | availability: 0.08, 203 | type: "relaxation", 204 | participants: 1, 205 | price: 0.1, 206 | accessibility: "Minor challenges", 207 | duration: "hours", 208 | kidFriendly: false, 209 | link: "", 210 | key: "5092652", 211 | }, 212 | { 213 | activity: "Take a bubble bath", 214 | availability: 0.1, 215 | type: "relaxation", 216 | participants: 1, 217 | price: 0.15, 218 | accessibility: "'Minor challenges", 219 | duration: "minutes", 220 | kidFriendly: true, 221 | link: "", 222 | key: "2581372", 223 | }, 224 | { 225 | activity: "Go to a nail salon", 226 | availability: 0.5, 227 | type: "relaxation", 228 | participants: 1, 229 | price: 0.4, 230 | accessibility: "Few to no challenges", 231 | duration: "minutes", 232 | kidFriendly: true, 233 | link: "", 234 | key: "7526324", 235 | }, 236 | { 237 | activity: "Listen to your favorite album", 238 | availability: 0.2, 239 | type: "music", 240 | participants: 1, 241 | price: 0.08, 242 | accessibility: "Few to no challenges", 243 | duration: "minutes", 244 | kidFriendly: true, 245 | link: "", 246 | key: "3136729", 247 | }, 248 | { 249 | activity: "Learn to play a new instrument", 250 | availability: 0.6, 251 | type: "music", 252 | participants: 1, 253 | price: 0.55, 254 | accessibility: "Major challenges", 255 | duration: "hours", 256 | kidFriendly: true, 257 | link: "", 258 | key: "3192099", 259 | }, 260 | { 261 | activity: "Teach your dog a new trick", 262 | availability: 0.15, 263 | type: "relaxation", 264 | participants: 1, 265 | price: 0.05, 266 | accessibility: "Minor challenges", 267 | duration: "minutes", 268 | kidFriendly: true, 269 | link: "", 270 | key: "1668223", 271 | }, 272 | { 273 | activity: "Make a to-do list for your week", 274 | availability: 0.05, 275 | type: "busywork", 276 | participants: 1, 277 | price: 0.0, 278 | accessibility: "Few to no challenges", 279 | duration: "minutes", 280 | kidFriendly: true, 281 | link: "", 282 | key: "5920481", 283 | }, 284 | { 285 | activity: "Go swimming with a friend", 286 | availability: 0.1, 287 | type: "social", 288 | participants: 2, 289 | price: 0.1, 290 | accessibility: "Major challenges", 291 | duration: "minutes", 292 | kidFriendly: true, 293 | link: "", 294 | key: "1505028", 295 | }, 296 | { 297 | activity: "Go on a long drive with no music", 298 | availability: 0.2, 299 | type: "relaxation", 300 | participants: 1, 301 | price: 0.1, 302 | accessibility: "Minor challenges", 303 | duration: "hours", 304 | kidFriendly: true, 305 | link: "", 306 | key: "4290333", 307 | }, 308 | { 309 | activity: "Watch a movie you'd never usually watch", 310 | availability: 0.15, 311 | type: "relaxation", 312 | participants: 1, 313 | price: 0.15, 314 | accessibility: "Few to no challenges", 315 | duration: "hours", 316 | kidFriendly: true, 317 | link: "", 318 | key: "9212950", 319 | }, 320 | { 321 | activity: "Go see a movie in theaters with a few friends", 322 | availability: 0.3, 323 | type: "social", 324 | participants: 4, 325 | price: 0.2, 326 | accessibility: "Minor challenges", 327 | duration: "hours", 328 | kidFriendly: true, 329 | link: "", 330 | key: "5262759", 331 | }, 332 | { 333 | activity: "Draw and color a Mandala", 334 | availability: 0.1, 335 | type: "relaxation", 336 | participants: 1, 337 | price: 0.05, 338 | accessibility: "Few to no challenges", 339 | duration: "minutes", 340 | kidFriendly: true, 341 | link: "https://en.wikipedia.org/wiki/Mandala", 342 | key: "4614092", 343 | }, 344 | { 345 | activity: "Rearrange and organize your room", 346 | availability: 0.15, 347 | type: "busywork", 348 | participants: 1, 349 | price: 0.0, 350 | accessibility: "Minor challenges", 351 | duration: "minutes", 352 | kidFriendly: true, 353 | link: "", 354 | key: "6197243", 355 | }, 356 | { 357 | activity: "Pot some plants and put them around your house", 358 | availability: 0.3, 359 | type: "relaxation", 360 | participants: 1, 361 | price: 0.4, 362 | accessibility: "Few to no challenges", 363 | duration: "minutes", 364 | kidFriendly: true, 365 | link: "", 366 | key: "6613330", 367 | }, 368 | { 369 | activity: "Plan a vacation you've always wanted to take", 370 | availability: 0.05, 371 | type: "relaxation", 372 | participants: 1, 373 | price: 0.0, 374 | accessibility: "Few to no challenges", 375 | duration: "minutes", 376 | kidFriendly: true, 377 | link: "", 378 | key: "7265395", 379 | }, 380 | { 381 | activity: "Take your cat on a walk", 382 | availability: 0.1, 383 | type: "relaxation", 384 | participants: 1, 385 | price: 0.02, 386 | accessibility: "Few to no challenges", 387 | duration: "minutes", 388 | kidFriendly: true, 389 | link: "", 390 | key: "5940465", 391 | }, 392 | { 393 | activity: "Have a football scrimmage with some friends", 394 | availability: 0.2, 395 | type: "social", 396 | participants: 8, 397 | price: 0, 398 | accessibility: "Major challenges", 399 | duration: "minutes", 400 | kidFriendly: true, 401 | link: "", 402 | key: "1638604", 403 | }, 404 | { 405 | activity: "Fill out a basketball bracket", 406 | availability: 0.1, 407 | type: "recreational", 408 | participants: 1, 409 | price: 0, 410 | accessibility: "Few to no challenges", 411 | duration: "minutes", 412 | kidFriendly: true, 413 | link: "", 414 | key: "7806284", 415 | }, 416 | { 417 | activity: "Play a game of tennis with a friend", 418 | availability: 0.4, 419 | type: "social", 420 | participants: 2, 421 | price: 0.1, 422 | accessibility: "Major challenges", 423 | duration: "minutes", 424 | kidFriendly: true, 425 | link: "", 426 | key: "1093640", 427 | }, 428 | { 429 | activity: "Catch up with a friend over a lunch date", 430 | availability: 0.15, 431 | type: "social", 432 | participants: 2, 433 | price: 0.2, 434 | accessibility: "Few to no challenges", 435 | duration: "hours", 436 | kidFriendly: true, 437 | link: "", 438 | key: "5590133", 439 | }, 440 | { 441 | activity: "Learn how to iceskate or rollerskate", 442 | availability: 0.25, 443 | type: "recreational", 444 | participants: 1, 445 | price: 0.1, 446 | accessibility: "Major challenges", 447 | duration: "days", 448 | kidFriendly: true, 449 | link: "", 450 | key: "5947957", 451 | }, 452 | { 453 | activity: "Go to a concert with local artists with some friends", 454 | availability: 0.3, 455 | type: "social", 456 | participants: 3, 457 | price: 0.4, 458 | accessibility: "Minor challenges", 459 | duration: "hours", 460 | kidFriendly: true, 461 | link: "", 462 | key: "2211716", 463 | }, 464 | { 465 | activity: "Explore the nightlife of your city", 466 | availability: 0.32, 467 | type: "social", 468 | participants: 1, 469 | price: 0.1, 470 | accessibility: "Minor challenges", 471 | duration: "hours", 472 | kidFriendly: false, 473 | link: "", 474 | key: "2237769", 475 | }, 476 | { 477 | activity: "Fix something that's broken in your house", 478 | availability: 0.3, 479 | type: "diy", 480 | participants: 1, 481 | price: 0.1, 482 | accessibility: "Minor challenges", 483 | duration: "minutes", 484 | kidFriendly: true, 485 | link: "", 486 | key: "6925988", 487 | }, 488 | { 489 | activity: "Wash your car", 490 | availability: 0.15, 491 | type: "busywork", 492 | participants: 1, 493 | price: 0.05, 494 | accessibility: "Minor challenges", 495 | duration: "minutes", 496 | kidFriendly: true, 497 | link: "", 498 | key: "1017771", 499 | }, 500 | { 501 | activity: "Find a charity and donate to it", 502 | availability: 0.1, 503 | type: "charity", 504 | participants: 1, 505 | price: 0.4, 506 | accessibility: "Few to no challenges", 507 | duration: "minutes", 508 | kidFriendly: true, 509 | link: "", 510 | key: "1488053", 511 | }, 512 | { 513 | activity: "Hold a yard sale", 514 | availability: 0.1, 515 | type: "social", 516 | participants: 1, 517 | price: 0.0, 518 | accessibility: "Minor challenges", 519 | duration: "days", 520 | kidFriendly: true, 521 | link: "", 522 | key: "1432113", 523 | }, 524 | { 525 | activity: "Donate blood at a local blood center", 526 | availability: 0.35, 527 | type: "charity", 528 | participants: 1, 529 | price: 0.0, 530 | accessibility: "Minor challenges", 531 | duration: "minutes", 532 | kidFriendly: false, 533 | link: "https://www.redcross.org/give-blood", 534 | key: "6509779", 535 | }, 536 | { 537 | activity: "Volunteer and help out at a senior center", 538 | availability: 0.1, 539 | type: "charity", 540 | participants: 1, 541 | price: 0.0, 542 | accessibility: "Few to no challenges", 543 | duration: "hours", 544 | kidFriendly: true, 545 | link: "", 546 | key: "3920096", 547 | }, 548 | { 549 | activity: "Shop at support your local farmers market", 550 | availability: 0.1, 551 | type: "relaxation", 552 | participants: 1, 553 | price: 0.2, 554 | accessibility: "Few to no challenges", 555 | duration: "hours", 556 | kidFriendly: true, 557 | link: "", 558 | key: "8979931", 559 | }, 560 | { 561 | activity: "Learn a new recipe", 562 | availability: 0.05, 563 | type: "cooking", 564 | participants: 1, 565 | price: 0.0, 566 | accessibility: "Few to no challenges", 567 | duration: "minutes", 568 | kidFriendly: true, 569 | link: "", 570 | key: "6553978", 571 | }, 572 | { 573 | activity: "Create a cookbook with your favorite recipes", 574 | availability: 0.05, 575 | type: "cooking", 576 | participants: 1, 577 | price: 0.0, 578 | accessibility: "Few to no challenges", 579 | duration: "hours", 580 | kidFriendly: true, 581 | link: "", 582 | key: "1947449", 583 | }, 584 | { 585 | activity: "Create a compost pile", 586 | availability: 0.15, 587 | type: "diy", 588 | participants: 1, 589 | price: 0.0, 590 | accessibility: "Major challenges", 591 | duration: "hours", 592 | kidFriendly: true, 593 | link: "", 594 | key: "8631548", 595 | }, 596 | { 597 | activity: "Volunteer at your local food bank", 598 | availability: 0.1, 599 | type: "charity", 600 | participants: 1, 601 | price: 0.0, 602 | accessibility: "Few to no challenges", 603 | duration: "hours", 604 | kidFriendly: true, 605 | link: "", 606 | key: "2055368", 607 | }, 608 | { 609 | activity: "Create or update your resume", 610 | availability: 0.1, 611 | type: "busywork", 612 | participants: 1, 613 | price: 0.0, 614 | accessibility: "Minor challenges", 615 | duration: "minutes", 616 | kidFriendly: true, 617 | link: "", 618 | key: "9364041", 619 | }, 620 | { 621 | activity: "Paint the first thing you see", 622 | availability: 0.2, 623 | type: "recreational", 624 | participants: 1, 625 | price: 0.25, 626 | accessibility: "Minor challenges", 627 | duration: "minutes", 628 | kidFriendly: true, 629 | link: "", 630 | key: "1162360", 631 | }, 632 | { 633 | activity: "Start a blog for something you're passionate about", 634 | availability: 0.1, 635 | type: "recreational", 636 | participants: 1, 637 | price: 0.05, 638 | accessibility: "Minor challenges", 639 | duration: "hours", 640 | kidFriendly: true, 641 | link: "", 642 | key: "8364626", 643 | }, 644 | { 645 | activity: "Start a garden", 646 | availability: 0.35, 647 | type: "recreational", 648 | participants: 1, 649 | price: 0.3, 650 | accessibility: "Major challenges", 651 | duration: "hours", 652 | kidFriendly: true, 653 | link: "", 654 | key: "1934228", 655 | }, 656 | { 657 | activity: "Clean out your closet and donate the clothes you've outgrown", 658 | availability: 0.1, 659 | type: "charity", 660 | participants: 1, 661 | price: 0.0, 662 | accessibility: "Few to no challenges", 663 | duration: "minutes", 664 | kidFriendly: true, 665 | link: "", 666 | key: "9026787", 667 | }, 668 | { 669 | activity: "Catch up on world news", 670 | availability: 0.07, 671 | type: "recreational", 672 | participants: 1, 673 | price: 0.05, 674 | accessibility: "Few to no challenges", 675 | duration: "minutes", 676 | kidFriendly: true, 677 | link: "", 678 | key: "6596257", 679 | }, 680 | { 681 | activity: "Create a personal website", 682 | availability: 0.12, 683 | type: "recreational", 684 | participants: 1, 685 | price: 0.1, 686 | accessibility: "Minor challenges", 687 | duration: "hours", 688 | kidFriendly: true, 689 | link: "", 690 | key: "3141417", 691 | }, 692 | { 693 | activity: "Listen to a new podcast", 694 | availability: 0.12, 695 | type: "relaxation", 696 | participants: 1, 697 | price: 0.05, 698 | accessibility: "Few to no challenges", 699 | duration: "minutes", 700 | kidFriendly: true, 701 | link: "", 702 | key: "4124860", 703 | }, 704 | { 705 | activity: "Have a paper airplane contest with some friends", 706 | availability: 0.05, 707 | type: "social", 708 | participants: 4, 709 | price: 0.02, 710 | accessibility: "Few to no challenges", 711 | duration: "minutes", 712 | kidFriendly: true, 713 | link: "", 714 | key: "8557562", 715 | }, 716 | { 717 | activity: "Learn calligraphy", 718 | availability: 0.1, 719 | type: "education", 720 | participants: 1, 721 | price: 0.1, 722 | accessibility: "Minor challenges", 723 | duration: "weeks", 724 | kidFriendly: true, 725 | link: "", 726 | key: "4565537", 727 | }, 728 | { 729 | activity: "Start a collection", 730 | availability: 0.5, 731 | type: "recreational", 732 | participants: 1, 733 | price: 0.0, 734 | accessibility: "Few to no challenges", 735 | duration: "hours", 736 | kidFriendly: true, 737 | link: "", 738 | key: "1718657", 739 | }, 740 | { 741 | activity: "Go to a local thrift shop", 742 | availability: 0.2, 743 | type: "recreational", 744 | participants: 1, 745 | price: 0.1, 746 | accessibility: "Few to no challenges", 747 | duration: "hours", 748 | kidFriendly: true, 749 | link: "", 750 | key: "8503795", 751 | }, 752 | { 753 | activity: "Make a couch fort", 754 | availability: 0.08, 755 | type: "recreational", 756 | participants: 1, 757 | price: 0.0, 758 | accessibility: "Minor challenges", 759 | duration: "minutes", 760 | kidFriendly: true, 761 | link: "", 762 | key: "2352669", 763 | }, 764 | { 765 | activity: "Pick up litter around your favorite park", 766 | availability: 0.05, 767 | type: "charity", 768 | participants: 1, 769 | price: 0.0, 770 | accessibility: "Minor challenges", 771 | duration: "minutes", 772 | kidFriendly: true, 773 | link: "", 774 | key: "4894697", 775 | }, 776 | { 777 | activity: "Buy a new house decoration", 778 | availability: 0.3, 779 | type: "recreational", 780 | participants: 1, 781 | price: 0.4, 782 | accessibility: "Few to no challenges", 783 | duration: "minutes", 784 | kidFriendly: true, 785 | link: "", 786 | key: "3456114", 787 | }, 788 | { 789 | activity: 790 | "Write a thank you letter to an influential person in your life", 791 | availability: 0.1, 792 | type: "social", 793 | participants: 1, 794 | price: 0.0, 795 | accessibility: "Few to no challenges", 796 | duration: "minutes", 797 | kidFriendly: true, 798 | link: "", 799 | key: "4101229", 800 | }, 801 | { 802 | activity: "Clean out your car", 803 | availability: 0.08, 804 | type: "busywork", 805 | participants: 1, 806 | price: 0.0, 807 | accessibility: "Minor challenges", 808 | duration: "minutes", 809 | kidFriendly: true, 810 | link: "", 811 | key: "2896176", 812 | }, 813 | { 814 | activity: "Write a short story", 815 | availability: 0.1, 816 | type: "recreational", 817 | participants: 1, 818 | price: 0.0, 819 | accessibility: "Few to no challenges", 820 | duration: "hours", 821 | kidFriendly: true, 822 | link: "", 823 | key: "6301585", 824 | }, 825 | { 826 | activity: "Do something nice for someone you care about", 827 | availability: 0.1, 828 | type: "social", 829 | participants: 1, 830 | price: 0.0, 831 | accessibility: "Few to no challenges", 832 | duration: "minutes", 833 | kidFriendly: true, 834 | link: "", 835 | key: "8321894", 836 | }, 837 | { 838 | activity: "Think of a new business idea", 839 | availability: 0.05, 840 | type: "recreational", 841 | participants: 1, 842 | price: 0.0, 843 | accessibility: "Few to no challenges", 844 | duration: "minutes", 845 | kidFriendly: true, 846 | link: "", 847 | key: "6808057", 848 | }, 849 | { 850 | activity: "Clean out your garage", 851 | availability: 0.1, 852 | type: "busywork", 853 | participants: 1, 854 | price: 0.0, 855 | accessibility: "Minor challenges", 856 | duration: "hours", 857 | kidFriendly: true, 858 | link: "", 859 | key: "7023703", 860 | }, 861 | { 862 | activity: "Learn to sew on a button", 863 | availability: 0.1, 864 | type: "education", 865 | participants: 1, 866 | price: 0.05, 867 | accessibility: "Few to no challenges", 868 | duration: "minutes", 869 | kidFriendly: true, 870 | link: "", 871 | key: "8731971", 872 | }, 873 | { 874 | activity: "Learn how to french braid hair", 875 | availability: 0.1, 876 | type: "education", 877 | participants: 1, 878 | price: 0.0, 879 | accessibility: "Few to no challenges", 880 | duration: "minutes", 881 | kidFriendly: true, 882 | link: "", 883 | key: "8926492", 884 | }, 885 | { 886 | activity: "Learn how to whistle with your fingers", 887 | availability: 0.0, 888 | type: "education", 889 | participants: 1, 890 | price: 0.0, 891 | accessibility: "Minor challenges", 892 | duration: "minutes", 893 | kidFriendly: true, 894 | link: "", 895 | key: "2790297", 896 | }, 897 | { 898 | activity: "Learn to write with your nondominant hand", 899 | availability: 0.02, 900 | type: "recreational", 901 | participants: 1, 902 | price: 0.0, 903 | accessibility: "Few to no challenges", 904 | duration: "minutes", 905 | kidFriendly: true, 906 | link: "", 907 | key: "1645485", 908 | }, 909 | { 910 | activity: "Make bread from scratch", 911 | availability: 0.2, 912 | type: "cooking", 913 | participants: 1, 914 | price: 0.2, 915 | accessibility: "Minor challenges", 916 | duration: "hours", 917 | kidFriendly: true, 918 | link: "", 919 | key: "4809815", 920 | }, 921 | { 922 | activity: "Make a budget", 923 | availability: 0.1, 924 | type: "busywork", 925 | participants: 1, 926 | price: 0.0, 927 | accessibility: "Few to no challenges", 928 | duration: "minutes", 929 | kidFriendly: true, 930 | link: "", 931 | key: "4379552", 932 | }, 933 | { 934 | activity: "Learn how to write in shorthand", 935 | availability: 0.1, 936 | type: "education", 937 | participants: 1, 938 | price: 0.0, 939 | accessibility: "Minor challenges", 940 | duration: "days", 941 | kidFriendly: true, 942 | link: "", 943 | key: "6778219", 944 | }, 945 | { 946 | activity: "Make a simple musical instrument", 947 | availability: 0.25, 948 | type: "music", 949 | participants: 1, 950 | price: 0.4, 951 | accessibility: "Minor challenges", 952 | duration: "minutes", 953 | kidFriendly: true, 954 | link: "", 955 | key: "7091374", 956 | }, 957 | { 958 | activity: "Go to the gym", 959 | availability: 0.1, 960 | type: "recreational", 961 | participants: 1, 962 | price: 0.2, 963 | accessibility: "Minor challenges", 964 | duration: "hours", 965 | kidFriendly: false, 966 | link: "", 967 | key: "4387026", 968 | }, 969 | { 970 | activity: "Try a food you don't like", 971 | availability: 0.05, 972 | type: "recreational", 973 | participants: 1, 974 | price: 0.1, 975 | accessibility: "Few to no challenges", 976 | duration: "minutes", 977 | kidFriendly: true, 978 | link: "", 979 | key: "6693574", 980 | }, 981 | { 982 | activity: "Conquer one of your fears", 983 | availability: 0.1, 984 | type: "recreational", 985 | participants: 1, 986 | price: 0.1, 987 | accessibility: "Few to no challenges", 988 | duration: "minutes", 989 | kidFriendly: true, 990 | link: "", 991 | key: "8344539", 992 | }, 993 | { 994 | activity: "Go to a concert with some friends", 995 | availability: 0.4, 996 | type: "social", 997 | participants: 4, 998 | price: 0.6, 999 | accessibility: "Minor challenges", 1000 | duration: "hours", 1001 | kidFriendly: true, 1002 | link: "", 1003 | key: "4558850", 1004 | }, 1005 | { 1006 | activity: "Go to the library and find an interesting book", 1007 | availability: 0.2, 1008 | type: "relaxation", 1009 | participants: 1, 1010 | price: 0.05, 1011 | accessibility: "Few to no challenges", 1012 | duration: "minutes", 1013 | kidFriendly: true, 1014 | link: "", 1015 | key: "8253550", 1016 | }, 1017 | { 1018 | activity: "Go to an escape room", 1019 | availability: 0.3, 1020 | type: "social", 1021 | participants: 4, 1022 | price: 0.5, 1023 | accessibility: "Minor challenges", 1024 | duration: "hours", 1025 | kidFriendly: true, 1026 | link: "", 1027 | key: "5585829", 1028 | }, 1029 | { 1030 | activity: "Go to a karaoke bar with some friends", 1031 | availability: 0.35, 1032 | type: "social", 1033 | participants: 4, 1034 | price: 0.5, 1035 | accessibility: "Few to no challenges", 1036 | duration: "hours", 1037 | kidFriendly: true, 1038 | link: "", 1039 | key: "9072906", 1040 | }, 1041 | { 1042 | activity: "Repaint a room in your house", 1043 | availability: 0.4, 1044 | type: "recreational", 1045 | participants: 1, 1046 | price: 0.3, 1047 | accessibility: "Minor challenges", 1048 | duration: "hours", 1049 | kidFriendly: true, 1050 | link: "", 1051 | key: "4877086", 1052 | }, 1053 | { 1054 | activity: "Pull a harmless prank on one of your friends", 1055 | availability: 0.2, 1056 | type: "social", 1057 | participants: 1, 1058 | price: 0.1, 1059 | accessibility: "Few to no challenges", 1060 | duration: "minutes", 1061 | kidFriendly: true, 1062 | link: "", 1063 | key: "1288934", 1064 | }, 1065 | { 1066 | activity: "Take a spontaneous road trip with some friends", 1067 | availability: 0.3, 1068 | type: "social", 1069 | participants: 4, 1070 | price: 0.2, 1071 | accessibility: "Few to no challenges", 1072 | duration: "days", 1073 | kidFriendly: true, 1074 | link: "", 1075 | key: "2085321", 1076 | }, 1077 | { 1078 | activity: "Go stargazing", 1079 | availability: 0.1, 1080 | type: "relaxation", 1081 | participants: 1, 1082 | price: 0.0, 1083 | accessibility: "Few to no challenges", 1084 | duration: "minutes", 1085 | kidFriendly: true, 1086 | link: "", 1087 | key: "8832605", 1088 | }, 1089 | { 1090 | activity: "Invite some friends over for a game night", 1091 | availability: 0.2, 1092 | type: "social", 1093 | participants: 4, 1094 | price: 0.0, 1095 | accessibility: "Few to no challenges", 1096 | duration: "hours", 1097 | kidFriendly: true, 1098 | link: "", 1099 | key: "6613428", 1100 | }, 1101 | { 1102 | activity: "Make homemade ice cream", 1103 | availability: 0.2, 1104 | type: "cooking", 1105 | participants: 1, 1106 | price: 0.2, 1107 | accessibility: "Few to no challenges", 1108 | duration: "minutes", 1109 | kidFriendly: true, 1110 | link: "", 1111 | key: "3818400", 1112 | }, 1113 | { 1114 | activity: "Start a daily journal", 1115 | availability: 0.0, 1116 | type: "relaxation", 1117 | participants: 1, 1118 | price: 0.0, 1119 | accessibility: "Few to no challenges", 1120 | duration: "minutes", 1121 | kidFriendly: true, 1122 | link: "", 1123 | key: "8779876", 1124 | }, 1125 | { 1126 | activity: "Go to a music festival with some friends", 1127 | availability: 0.2, 1128 | type: "social", 1129 | participants: 4, 1130 | price: 0.4, 1131 | accessibility: "Minor challenges", 1132 | duration: "days", 1133 | kidFriendly: true, 1134 | link: "", 1135 | key: "6482790", 1136 | }, 1137 | { 1138 | activity: "Make a bucket list", 1139 | availability: 0.0, 1140 | type: "busywork", 1141 | participants: 1, 1142 | price: 0.0, 1143 | accessibility: "Few to no challenges", 1144 | duration: "minutes", 1145 | kidFriendly: true, 1146 | link: "", 1147 | key: "2735499", 1148 | }, 1149 | { 1150 | activity: "Binge watch a trending series", 1151 | availability: 0.2, 1152 | type: "recreational", 1153 | participants: 1, 1154 | price: 0.2, 1155 | accessibility: "Few to no challenges", 1156 | duration: "hours", 1157 | kidFriendly: true, 1158 | link: "", 1159 | key: "5881647", 1160 | }, 1161 | { 1162 | activity: "Learn how to make a website", 1163 | availability: 0.3, 1164 | type: "education", 1165 | participants: 1, 1166 | price: 0.1, 1167 | accessibility: "Minor challenges", 1168 | duration: "hours", 1169 | kidFriendly: true, 1170 | link: "", 1171 | key: "9924423", 1172 | }, 1173 | { 1174 | activity: "Create and follow a savings plan", 1175 | availability: 0.2, 1176 | type: "busywork", 1177 | participants: 1, 1178 | price: 0.0, 1179 | accessibility: "Few to no challenges", 1180 | duration: "minutes", 1181 | kidFriendly: true, 1182 | link: "", 1183 | key: "9366464", 1184 | }, 1185 | { 1186 | activity: "Watch a classic movie", 1187 | availability: 0.1, 1188 | type: "recreational", 1189 | participants: 1, 1190 | price: 0.1, 1191 | accessibility: "Few to no challenges", 1192 | duration: "hours", 1193 | kidFriendly: true, 1194 | link: "", 1195 | key: "8081693", 1196 | }, 1197 | { 1198 | activity: "Plan a trip to another country", 1199 | availability: 0.0, 1200 | type: "recreational", 1201 | participants: 1, 1202 | price: 0.0, 1203 | accessibility: "Few to no challenges", 1204 | duration: "hours", 1205 | kidFriendly: true, 1206 | link: "", 1207 | key: "5554727", 1208 | }, 1209 | { 1210 | activity: "Learn how the internet works", 1211 | availability: 0.1, 1212 | type: "education", 1213 | participants: 1, 1214 | price: 0.0, 1215 | accessibility: "Few to no challenges", 1216 | duration: "minutes", 1217 | kidFriendly: true, 1218 | link: "", 1219 | key: "9414706", 1220 | }, 1221 | { 1222 | activity: "Take a hike at a local park", 1223 | availability: 0.1, 1224 | type: "recreational", 1225 | participants: 1, 1226 | price: 0.0, 1227 | accessibility: "Minor challenges", 1228 | duration: "hours", 1229 | kidFriendly: true, 1230 | link: "", 1231 | key: "8724324", 1232 | }, 1233 | { 1234 | activity: "Make tie dye shirts", 1235 | availability: 0.2, 1236 | type: "diy", 1237 | participants: 1, 1238 | price: 0.2, 1239 | accessibility: "Few to no challenges", 1240 | duration: "hours", 1241 | kidFriendly: true, 1242 | link: "", 1243 | key: "8092359", 1244 | }, 1245 | { 1246 | activity: "Make a scrapbook with pictures of your favorite memories", 1247 | availability: 0.1, 1248 | type: "diy", 1249 | participants: 1, 1250 | price: 0.1, 1251 | accessibility: "Few to no challenges", 1252 | duration: "hours", 1253 | kidFriendly: true, 1254 | link: "", 1255 | key: "5554174", 1256 | }, 1257 | { 1258 | activity: "Have a picnic with some friends", 1259 | availability: 0.1, 1260 | type: "social", 1261 | participants: 3, 1262 | price: 0.1, 1263 | accessibility: "Few to no challenges", 1264 | duration: "hours", 1265 | kidFriendly: true, 1266 | link: "", 1267 | key: "6813070", 1268 | }, 1269 | { 1270 | activity: "Have a bonfire with your close friends", 1271 | availability: 0.1, 1272 | type: "social", 1273 | participants: 4, 1274 | price: 0.1, 1275 | accessibility: "Minor challenges", 1276 | duration: "hours", 1277 | kidFriendly: true, 1278 | link: "", 1279 | key: "8442249", 1280 | }, 1281 | { 1282 | activity: "Memorize the fifty states and their capitals", 1283 | availability: 0.0, 1284 | type: "education", 1285 | participants: 1, 1286 | price: 0.0, 1287 | accessibility: "Few to no challenges", 1288 | duration: "minutes", 1289 | kidFriendly: true, 1290 | link: "", 1291 | key: "4179309", 1292 | }, 1293 | { 1294 | activity: 1295 | "Take a class at your local community center that interests you", 1296 | availability: 0.15, 1297 | type: "education", 1298 | participants: 1, 1299 | price: 0.0, 1300 | accessibility: "Few to no challenges", 1301 | duration: "hours", 1302 | kidFriendly: true, 1303 | link: "", 1304 | key: "8750692", 1305 | }, 1306 | { 1307 | activity: "Resolve a problem you've been putting off", 1308 | availability: 0.0, 1309 | type: "busywork", 1310 | participants: 1, 1311 | price: 0.0, 1312 | accessibility: "Few to no challenges", 1313 | duration: "minutes", 1314 | kidFriendly: true, 1315 | link: "", 1316 | key: "9999999", 1317 | }, 1318 | { 1319 | activity: "Make a new friend", 1320 | availability: 0.0, 1321 | type: "social", 1322 | participants: 1, 1323 | price: 0.0, 1324 | accessibility: "Few to no challenges", 1325 | duration: "minutes", 1326 | kidFriendly: true, 1327 | link: "", 1328 | key: "1000000", 1329 | }, 1330 | { 1331 | activity: "Learn origami", 1332 | availability: 0.3, 1333 | type: "education", 1334 | participants: 1, 1335 | price: 0.2, 1336 | accessibility: "Minor challenges", 1337 | duration: "minutes", 1338 | kidFriendly: true, 1339 | link: "", 1340 | key: "8394738", 1341 | }, 1342 | { 1343 | activity: "Learn how to use a french press", 1344 | availability: 0.3, 1345 | type: "recreational", 1346 | participants: 1, 1347 | price: 0.3, 1348 | accessibility: "Few to no challenges", 1349 | duration: "minutes", 1350 | kidFriendly: true, 1351 | link: "https://en.wikipedia.org/wiki/French_press", 1352 | key: "4522866", 1353 | }, 1354 | { 1355 | activity: "Read a formal research paper on an interesting subject", 1356 | availability: 0.1, 1357 | type: "education", 1358 | participants: 1, 1359 | price: 0.0, 1360 | accessibility: "Few to no challenges", 1361 | duration: "minutes", 1362 | kidFriendly: true, 1363 | link: "", 1364 | key: "3352474", 1365 | }, 1366 | { 1367 | activity: "Listen to a new music genre", 1368 | availability: 0, 1369 | type: "music", 1370 | participants: 1, 1371 | price: 0, 1372 | accessibility: "Few to no challenges", 1373 | duration: "minutes", 1374 | kidFriendly: true, 1375 | link: "", 1376 | key: "4708863", 1377 | }, 1378 | { 1379 | activity: "Volunteer at your local food pantry", 1380 | availability: 0.1, 1381 | type: "charity", 1382 | participants: 1, 1383 | price: 0.0, 1384 | accessibility: "Few to no challenges", 1385 | duration: "hours", 1386 | kidFriendly: true, 1387 | link: "", 1388 | key: "1878070", 1389 | }, 1390 | { 1391 | activity: "Learn how to make an Alexa skill", 1392 | availability: 0.1, 1393 | type: "education", 1394 | participants: 1, 1395 | price: 0.0, 1396 | accessibility: "Minor challenges", 1397 | duration: "hours", 1398 | kidFriendly: true, 1399 | link: "https://developer.amazon.com/en-US/docs/alexa/custom-skills/steps-to-build-a-custom-skill.html", 1400 | key: "1592381", 1401 | }, 1402 | { 1403 | activity: "Surprise your significant other with something considerate", 1404 | availability: 0.0, 1405 | type: "social", 1406 | participants: 1, 1407 | price: 0.0, 1408 | accessibility: "Few to no challenges", 1409 | duration: "minutes", 1410 | kidFriendly: true, 1411 | link: "", 1412 | key: "6204657", 1413 | }, 1414 | { 1415 | activity: "Learn Kotlin", 1416 | availability: 0.8, 1417 | type: "education", 1418 | participants: 1, 1419 | price: 0.0, 1420 | accessibility: "Few to no challenges", 1421 | duration: "hours", 1422 | kidFriendly: true, 1423 | link: "https://kotlinlang.org/", 1424 | key: "3950821", 1425 | }, 1426 | { 1427 | activity: "Go for a run", 1428 | availability: 0.9, 1429 | type: "recreational", 1430 | participants: 1, 1431 | price: 0.0, 1432 | accessibility: "Major challenges", 1433 | duration: "minutes", 1434 | kidFriendly: true, 1435 | link: "", 1436 | key: "6852505", 1437 | }, 1438 | { 1439 | activity: "Learn woodworking", 1440 | availability: 0.3, 1441 | type: "diy", 1442 | participants: 1, 1443 | price: 0.3, 1444 | accessibility: "Minor challenges", 1445 | duration: "weeks", 1446 | kidFriendly: true, 1447 | link: "", 1448 | key: "9216391", 1449 | }, 1450 | { 1451 | activity: "Start a band", 1452 | availability: 0.8, 1453 | type: "music", 1454 | participants: 4, 1455 | price: 0.3, 1456 | accessibility: "Few to no challenges", 1457 | duration: "minutes", 1458 | kidFriendly: true, 1459 | link: "", 1460 | key: "5675880", 1461 | }, 1462 | { 1463 | activity: "Cook something together with someone", 1464 | availability: 0.8, 1465 | type: "cooking", 1466 | participants: 2, 1467 | price: 0.3, 1468 | accessibility: "Few to no challenges", 1469 | duration: "hours", 1470 | kidFriendly: true, 1471 | link: "", 1472 | key: "1799120", 1473 | }, 1474 | { 1475 | activity: "Have a jam session with your friends", 1476 | availability: 0.3, 1477 | type: "music", 1478 | participants: 5, 1479 | price: 0.1, 1480 | accessibility: "Minor challenges", 1481 | duration: "hours", 1482 | kidFriendly: true, 1483 | link: "", 1484 | key: "2715253", 1485 | }, 1486 | { 1487 | activity: "Learn GraphQL", 1488 | availability: 0.8, 1489 | type: "education", 1490 | participants: 1, 1491 | price: 0.0, 1492 | accessibility: "Few to no challenges", 1493 | duration: "hours", 1494 | kidFriendly: true, 1495 | link: "https://graphql.org/", 1496 | key: "2167064", 1497 | }, 1498 | { 1499 | activity: "Play basketball with a group of friends", 1500 | availability: 0.7, 1501 | type: "social", 1502 | participants: 5, 1503 | price: 0.0, 1504 | accessibility: "Major challenges", 1505 | duration: "minutes", 1506 | kidFriendly: true, 1507 | link: "", 1508 | key: "8683473", 1509 | }, 1510 | { 1511 | activity: "Learn the Chinese erhu", 1512 | availability: 0.4, 1513 | type: "music", 1514 | participants: 1, 1515 | price: 0.6, 1516 | accessibility: "Few to no challenges", 1517 | duration: "hours", 1518 | kidFriendly: true, 1519 | link: "", 1520 | key: "2742452", 1521 | }, 1522 | { 1523 | activity: "Start a webinar on a topic of your choice", 1524 | availability: 0.9, 1525 | type: "education", 1526 | participants: 1, 1527 | price: 0.0, 1528 | accessibility: "Few to no challenges", 1529 | duration: "hours", 1530 | kidFriendly: true, 1531 | link: "", 1532 | key: "6826029", 1533 | }, 1534 | { 1535 | activity: "Learn how to use an Arduino", 1536 | availability: 0.7, 1537 | type: "education", 1538 | participants: 1, 1539 | price: 0.1, 1540 | accessibility: "Few to no challenges", 1541 | duration: "hours", 1542 | kidFriendly: true, 1543 | link: "https://en.wikipedia.org/wiki/Arduino", 1544 | key: "8264223", 1545 | }, 1546 | { 1547 | activity: "Go see a Broadway production", 1548 | availability: 0.3, 1549 | type: "recreational", 1550 | participants: 4, 1551 | price: 0.8, 1552 | accessibility: "Few to no challenges", 1553 | duration: "hours", 1554 | kidFriendly: true, 1555 | link: "", 1556 | key: "4448913", 1557 | }, 1558 | { 1559 | activity: "Learn Javascript", 1560 | availability: 0.9, 1561 | type: "education", 1562 | participants: 1, 1563 | price: 0, 1564 | accessibility: "Few to no challenges", 1565 | duration: "hours", 1566 | kidFriendly: true, 1567 | link: "", 1568 | key: "3469378", 1569 | }, 1570 | { 1571 | activity: "Visit your past teachers", 1572 | availability: 0.7, 1573 | type: "social", 1574 | participants: 1, 1575 | price: 0, 1576 | accessibility: "Few to no challenges", 1577 | duration: "hours", 1578 | kidFriendly: true, 1579 | link: "", 1580 | key: "8238918", 1581 | }, 1582 | { 1583 | activity: "Research a topic you're interested in", 1584 | availability: 0.9, 1585 | type: "education", 1586 | participants: 1, 1587 | price: 0.0, 1588 | accessibility: "Few to no challenges", 1589 | duration: "hours", 1590 | kidFriendly: true, 1591 | link: "", 1592 | key: "3561421", 1593 | }, 1594 | { 1595 | activity: "Listen to music you haven't heard in a while", 1596 | availability: 0.9, 1597 | type: "music", 1598 | participants: 1, 1599 | price: 0.05, 1600 | accessibility: "Few to no challenges", 1601 | duration: "minutes", 1602 | kidFriendly: true, 1603 | link: "", 1604 | key: "4296813", 1605 | }, 1606 | { 1607 | activity: "Go on a fishing trip with some friends", 1608 | availability: 0.4, 1609 | type: "social", 1610 | participants: 3, 1611 | price: 0.4, 1612 | accessibility: "Minor challenges", 1613 | duration: "hours", 1614 | kidFriendly: true, 1615 | link: "", 1616 | key: "3149232", 1617 | }, 1618 | { 1619 | activity: "Bake a pie with some friends", 1620 | availability: 0.3, 1621 | type: "cooking", 1622 | participants: 3, 1623 | price: 0.3, 1624 | accessibility: "Few to no challenges", 1625 | duration: "hours", 1626 | kidFriendly: true, 1627 | link: "", 1628 | key: "3141592", 1629 | }, 1630 | { 1631 | activity: "Do yoga", 1632 | availability: 0.9, 1633 | type: "recreational", 1634 | participants: 1, 1635 | price: 0.0, 1636 | accessibility: "Minor challenges", 1637 | duration: "minutes", 1638 | kidFriendly: true, 1639 | link: "", 1640 | key: "4688012", 1641 | }, 1642 | { 1643 | activity: "Visit a nearby museum", 1644 | availability: 0.7, 1645 | type: "recreational", 1646 | participants: 1, 1647 | price: 0.2, 1648 | accessibility: "Few to no challenges", 1649 | duration: "hours", 1650 | kidFriendly: true, 1651 | link: "", 1652 | key: "5490351", 1653 | }, 1654 | { 1655 | activity: "Have a photo session with some friends", 1656 | availability: 0.8, 1657 | type: "social", 1658 | participants: 4, 1659 | price: 0.05, 1660 | accessibility: "Few to no challenges", 1661 | duration: "minutes", 1662 | kidFriendly: true, 1663 | link: "", 1664 | key: "3305912", 1665 | }, 1666 | { 1667 | activity: "Watch the sunset or the sunrise", 1668 | availability: 1.0, 1669 | type: "recreational", 1670 | participants: 1, 1671 | price: 0.0, 1672 | accessibility: "Few to no challenges", 1673 | duration: "minutes", 1674 | kidFriendly: true, 1675 | link: "", 1676 | key: "4748214", 1677 | }, 1678 | { 1679 | activity: "Play a volleyball match with some friends", 1680 | availability: 0.3, 1681 | type: "social", 1682 | participants: 4, 1683 | price: 0.0, 1684 | accessibility: "Major challenges", 1685 | duration: "minutes", 1686 | kidFriendly: true, 1687 | link: "", 1688 | key: "4306710", 1689 | }, 1690 | { 1691 | activity: "Host a movie marathon with some friends", 1692 | availability: 0.0, 1693 | type: "social", 1694 | participants: 3, 1695 | price: 0.1, 1696 | accessibility: "Few to no challenges", 1697 | duration: "hours", 1698 | kidFriendly: true, 1699 | link: "", 1700 | key: "5914292", 1701 | }, 1702 | { 1703 | activity: "Hold a video game tournament with some friends", 1704 | availability: 0.1, 1705 | type: "social", 1706 | participants: 4, 1707 | price: 0.0, 1708 | accessibility: "Few to no challenges", 1709 | duration: "hours", 1710 | kidFriendly: true, 1711 | link: "", 1712 | key: "2300257", 1713 | }, 1714 | { 1715 | activity: "Write a poem", 1716 | availability: 0.0, 1717 | type: "recreational", 1718 | participants: 1, 1719 | price: 0.0, 1720 | accessibility: "Few to no challenges", 1721 | duration: "minutes", 1722 | kidFriendly: true, 1723 | link: "", 1724 | key: "8688620", 1725 | }, 1726 | { 1727 | activity: "Take a nap", 1728 | availability: 0.0, 1729 | type: "relaxation", 1730 | participants: 1, 1731 | price: 0.0, 1732 | accessibility: "Few to no challenges", 1733 | duration: "minutes", 1734 | kidFriendly: true, 1735 | link: "", 1736 | key: "6184514", 1737 | }, 1738 | { 1739 | activity: "Mow your lawn", 1740 | availability: 0.3, 1741 | type: "busywork", 1742 | participants: 1, 1743 | price: 0.1, 1744 | accessibility: "Minor challenges", 1745 | duration: "minutes", 1746 | kidFriendly: true, 1747 | link: "", 1748 | key: "3590127", 1749 | }, 1750 | { 1751 | activity: "Practice coding in your favorite lanaguage", 1752 | availability: 0.1, 1753 | type: "recreational", 1754 | participants: 1, 1755 | price: 0.0, 1756 | accessibility: "Few to no challenges", 1757 | duration: "minutes", 1758 | kidFriendly: true, 1759 | link: "", 1760 | key: "7096020", 1761 | }, 1762 | { 1763 | activity: "Write a song", 1764 | availability: 0.0, 1765 | type: "music", 1766 | participants: 1, 1767 | price: 0.0, 1768 | accessibility: "Few to no challenges'", 1769 | duration: "minutes", 1770 | kidFriendly: true, 1771 | link: "", 1772 | key: "5188388", 1773 | }, 1774 | { 1775 | activity: "Play a video game", 1776 | availability: 0.0, 1777 | type: "recreational", 1778 | participants: 1, 1779 | price: 0.0, 1780 | accessibility: "Few to no challenges", 1781 | duration: "hours", 1782 | kidFriendly: true, 1783 | link: "", 1784 | key: "5534113", 1785 | }, 1786 | { 1787 | activity: "Clean out your refrigerator", 1788 | availability: 0.0, 1789 | type: "busywork", 1790 | participants: 1, 1791 | price: 0.0, 1792 | accessibility: "Few to no challenges", 1793 | duration: "minutes", 1794 | kidFriendly: true, 1795 | link: "", 1796 | key: "9324336", 1797 | }, 1798 | { 1799 | activity: "Study a foreign language", 1800 | availability: 0.1, 1801 | type: "education", 1802 | participants: 1, 1803 | price: 0.0, 1804 | accessibility: "Few to no challenges", 1805 | duration: "weeks", 1806 | kidFriendly: true, 1807 | link: "", 1808 | key: "9765530", 1809 | }, 1810 | { 1811 | activity: "Learn the NATO phonetic alphabet", 1812 | availability: 0.0, 1813 | type: "education", 1814 | participants: 1, 1815 | price: 0.0, 1816 | accessibility: "Few to no challenges", 1817 | duration: "minutes", 1818 | kidFriendly: true, 1819 | link: "https://en.wikipedia.org/wiki/NATO_phonetic_alphabet", 1820 | key: "6706598", 1821 | }, 1822 | { 1823 | activity: "Solve a Rubik's cube", 1824 | availability: 0.1, 1825 | type: "recreational", 1826 | participants: 1, 1827 | price: 0.0, 1828 | accessibility: "Few to no challenges", 1829 | duration: "hours", 1830 | kidFriendly: true, 1831 | link: "", 1832 | key: "4151544", 1833 | }, 1834 | { 1835 | activity: "Make your own LEGO creation", 1836 | availability: 0.1, 1837 | type: "recreational", 1838 | participants: 1, 1839 | price: 0.0, 1840 | accessibility: "Few to no challenges", 1841 | duration: "minutes", 1842 | kidFriendly: true, 1843 | link: "", 1844 | key: "1129748", 1845 | }, 1846 | { 1847 | activity: "Plant a tree", 1848 | availability: 0.3, 1849 | type: "recreational", 1850 | participants: 1, 1851 | price: 0.3, 1852 | accessibility: "Minor challenges", 1853 | duration: "hours", 1854 | kidFriendly: true, 1855 | link: "", 1856 | key: "1942393", 1857 | }, 1858 | { 1859 | activity: 1860 | "Contribute code or a monetary donation to an open-source software project", 1861 | availability: 0.0, 1862 | type: "charity", 1863 | participants: 1, 1864 | price: 0.1, 1865 | accessibility: "Few to no challenges", 1866 | duration: "minutes", 1867 | kidFriendly: true, 1868 | link: "https://github.com/explore", 1869 | key: "7687030", 1870 | }, 1871 | { 1872 | activity: "Uninstall unused apps from your devices", 1873 | availability: 0.0, 1874 | type: "busywork", 1875 | participants: 1, 1876 | price: 0.0, 1877 | accessibility: "Few to no challenges", 1878 | duration: "minutes", 1879 | kidFriendly: true, 1880 | link: "", 1881 | key: "2850593", 1882 | }, 1883 | { 1884 | activity: "Prepare a dish from a foreign culture", 1885 | availability: 0.3, 1886 | type: "cooking", 1887 | participants: 1, 1888 | price: 0.2, 1889 | accessibility: "Few to no challenges", 1890 | duration: "hours", 1891 | kidFriendly: true, 1892 | link: "", 1893 | key: "8061754", 1894 | }, 1895 | { 1896 | activity: "Patronize a local independent restaurant", 1897 | availability: 0.1, 1898 | type: "recreational", 1899 | participants: 1, 1900 | price: 0.2, 1901 | accessibility: "Few to no challenges", 1902 | duration: "minutes", 1903 | kidFriendly: true, 1904 | link: "", 1905 | key: "5319204", 1906 | }, 1907 | { 1908 | activity: "Give your pet ten minutes of focused attention", 1909 | availability: 0.0, 1910 | type: "relaxation", 1911 | participants: 1, 1912 | price: 0.0, 1913 | accessibility: "Few to no challenges", 1914 | duration: "minutes", 1915 | kidFriendly: true, 1916 | link: "", 1917 | key: "9937387", 1918 | }, 1919 | { 1920 | activity: "Explore a park you have never been to before", 1921 | availability: 0.0, 1922 | type: "recreational", 1923 | participants: 1, 1924 | price: 0.0, 1925 | accessibility: "Few to no challenges", 1926 | duration: "hours", 1927 | kidFriendly: true, 1928 | link: "", 1929 | key: "8159356", 1930 | }, 1931 | { 1932 | activity: "Configure two-factor authentication on your accounts", 1933 | availability: 0.0, 1934 | type: "busywork", 1935 | participants: 1, 1936 | price: 0.0, 1937 | accessibility: "Few to no challenges", 1938 | duration: "minutes", 1939 | kidFriendly: true, 1940 | link: "https://en.wikipedia.org/wiki/Multi-factor_authentication", 1941 | key: "1572120", 1942 | }, 1943 | { 1944 | activity: "Create a meal plan for the coming week", 1945 | availability: 0.0, 1946 | type: "cooking", 1947 | participants: 1, 1948 | price: 0.0, 1949 | accessibility: "Few to no challenges", 1950 | duration: "minutes", 1951 | kidFriendly: true, 1952 | link: "", 1953 | key: "3491470", 1954 | }, 1955 | { 1956 | activity: "Watch a Khan Academy lecture on a subject of your choosing", 1957 | availability: 0.0, 1958 | type: "education", 1959 | participants: 1, 1960 | price: 0.0, 1961 | accessibility: "Few to no challenges", 1962 | duration: "minutes", 1963 | kidFriendly: true, 1964 | link: "https://www.khanacademy.org/", 1965 | key: "7154873", 1966 | }, 1967 | { 1968 | activity: "Shred old documents you don't need anymore", 1969 | availability: 0.0, 1970 | type: "busywork", 1971 | participants: 1, 1972 | price: 0.0, 1973 | accessibility: "Few to no challenges", 1974 | duration: "minutes", 1975 | kidFriendly: true, 1976 | link: "", 1977 | key: "2430066", 1978 | }, 1979 | { 1980 | activity: "Learn about a distributed version control system such as Git", 1981 | availability: 0.0, 1982 | type: "education", 1983 | participants: 1, 1984 | price: 0.0, 1985 | accessibility: "Few to no challenges", 1986 | duration: "hours", 1987 | kidFriendly: true, 1988 | link: "https://en.wikipedia.org/wiki/Distributed_version_control", 1989 | key: "9303608", 1990 | }, 1991 | { 1992 | activity: "Write a note of appreciation to someone", 1993 | availability: 0.0, 1994 | type: "social", 1995 | participants: 1, 1996 | price: 0.0, 1997 | accessibility: "Few to no challenges", 1998 | duration: "minutes", 1999 | kidFriendly: true, 2000 | link: "", 2001 | key: "1770521", 2002 | }, 2003 | { 2004 | activity: "Draw something interesting", 2005 | availability: 0.0, 2006 | type: "recreational", 2007 | participants: 1, 2008 | price: 0.0, 2009 | accessibility: "Few to no challenges", 2010 | duration: "minutes", 2011 | kidFriendly: true, 2012 | link: "", 2013 | key: "8033599", 2014 | }, 2015 | { 2016 | activity: "Learn and play a new card game", 2017 | availability: 0.0, 2018 | type: "recreational", 2019 | participants: 1, 2020 | price: 0.0, 2021 | accessibility: "Few to no challenges", 2022 | duration: "minutes", 2023 | kidFriendly: true, 2024 | link: "https://www.pagat.com", 2025 | key: "9660022", 2026 | }, 2027 | { 2028 | activity: "Write a list of things you are grateful for", 2029 | availability: 0.0, 2030 | type: "relaxation", 2031 | participants: 1, 2032 | price: 0.0, 2033 | accessibility: "Few to no challenges", 2034 | duration: "minutes", 2035 | kidFriendly: true, 2036 | link: "", 2037 | key: "2062010", 2038 | }, 2039 | { 2040 | activity: "Organize a bookshelf", 2041 | availability: 0.0, 2042 | type: "busywork", 2043 | participants: 1, 2044 | price: 0.0, 2045 | accessibility: "Few to no challenges", 2046 | duration: "minutes", 2047 | kidFriendly: true, 2048 | link: "", 2049 | key: "6098037", 2050 | }, 2051 | { 2052 | activity: "Organize a cluttered drawer", 2053 | availability: 0.0, 2054 | type: "busywork", 2055 | participants: 1, 2056 | price: 0.0, 2057 | accessibility: "Few to no challenges", 2058 | duration: "minutes", 2059 | kidFriendly: true, 2060 | link: "", 2061 | key: "9714586", 2062 | }, 2063 | { 2064 | activity: "Organize your music collection", 2065 | availability: 0.0, 2066 | type: "busywork", 2067 | participants: 1, 2068 | price: 0.0, 2069 | accessibility: "Few to no challenges", 2070 | duration: "hours", 2071 | kidFriendly: true, 2072 | link: "", 2073 | key: "3151646", 2074 | }, 2075 | { 2076 | activity: "Organize your movie collection", 2077 | availability: 0.0, 2078 | type: "busywork", 2079 | participants: 1, 2080 | price: 0.0, 2081 | accessibility: "Few to no challenges", 2082 | duration: "hours", 2083 | kidFriendly: true, 2084 | link: "", 2085 | key: "6378359", 2086 | }, 2087 | { 2088 | activity: "Learn Morse code", 2089 | availability: 0.0, 2090 | type: "education", 2091 | participants: 1, 2092 | price: 0.0, 2093 | accessibility: "Few to no challenges", 2094 | duration: "hours", 2095 | kidFriendly: true, 2096 | link: "https://en.wikipedia.org/wiki/Morse_code", 2097 | key: "3646173", 2098 | }, 2099 | { 2100 | activity: "Go for a walk", 2101 | availability: 0.1, 2102 | type: "relaxation", 2103 | participants: 1, 2104 | price: 0.0, 2105 | accessibility: "Few to no challenges", 2106 | duration: "minutes", 2107 | kidFriendly: true, 2108 | link: "", 2109 | key: "4286250", 2110 | }, 2111 | { 2112 | activity: "Mow your neighbor's lawn", 2113 | availability: 0.2, 2114 | type: "charity", 2115 | participants: 1, 2116 | price: 0.0, 2117 | accessibility: "Minor challenges", 2118 | duration: "minutes", 2119 | kidFriendly: false, 2120 | link: "", 2121 | key: "1303906", 2122 | }, 2123 | { 2124 | activity: "Compliment someone", 2125 | availability: 0.0, 2126 | type: "social", 2127 | participants: 2, 2128 | price: 0.0, 2129 | accessibility: "Few to no challenges", 2130 | duration: "minutes", 2131 | kidFriendly: true, 2132 | link: "", 2133 | key: "9149470", 2134 | }, 2135 | { 2136 | activity: "Draft your living will", 2137 | availability: 0.5, 2138 | type: "busywork", 2139 | participants: 1, 2140 | price: 0.0, 2141 | accessibility: "Few to no challenges", 2142 | duration: "hours", 2143 | kidFriendly: false, 2144 | link: "https://www.investopedia.com/terms/l/livingwill.asp", 2145 | key: "2360432", 2146 | }, 2147 | { 2148 | activity: "Prepare a 72-hour kit", 2149 | availability: 0.5, 2150 | type: "busywork", 2151 | participants: 1, 2152 | price: 0.5, 2153 | accessibility: "Few to no challenges", 2154 | duration: "minutes", 2155 | kidFriendly: true, 2156 | link: "https://www.ready.gov/kit", 2157 | key: "4266522", 2158 | }, 2159 | { 2160 | activity: "Color", 2161 | availability: 0.0, 2162 | type: "relaxation", 2163 | participants: 1, 2164 | price: 0.1, 2165 | accessibility: "Few to no challenges", 2166 | duration: "minutes", 2167 | kidFriendly: true, 2168 | link: "", 2169 | key: "5322987", 2170 | }, 2171 | { 2172 | activity: "Organize your pantry", 2173 | availability: 0.0, 2174 | type: "busywork", 2175 | participants: 1, 2176 | price: 0.0, 2177 | accessibility: "Few to no challenges", 2178 | duration: "minutes", 2179 | kidFriendly: true, 2180 | link: "", 2181 | key: "3954882", 2182 | }, 2183 | { 2184 | activity: "Back up important computer files", 2185 | availability: 0.2, 2186 | type: "busywork", 2187 | participants: 1, 2188 | price: 0.2, 2189 | accessibility: "Few to no challenges", 2190 | duration: "minutes", 2191 | kidFriendly: false, 2192 | link: "", 2193 | key: "9081214", 2194 | }, 2195 | { 2196 | activity: "Memorize a favorite quote or poem", 2197 | availability: 0.8, 2198 | type: "education", 2199 | participants: 1, 2200 | price: 0.0, 2201 | accessibility: "Few to no challenges", 2202 | duration: "minutes", 2203 | kidFriendly: true, 2204 | link: "", 2205 | key: "9008639", 2206 | }, 2207 | { 2208 | activity: "Do something you used to do as a kid", 2209 | availability: 0.8, 2210 | type: "relaxation", 2211 | participants: 1, 2212 | price: 0.1, 2213 | accessibility: "Few to no challenges", 2214 | duration: "minutes", 2215 | kidFriendly: true, 2216 | link: "", 2217 | key: "8827573", 2218 | }, 2219 | { 2220 | activity: "Organize your basement", 2221 | availability: 0.9, 2222 | type: "busywork", 2223 | participants: 1, 2224 | price: 0.0, 2225 | accessibility: "Few to no challenges", 2226 | duration: "hours", 2227 | kidFriendly: true, 2228 | link: "", 2229 | key: "8203595", 2230 | }, 2231 | { 2232 | activity: 2233 | "Sit in the dark and listen to your favorite music with no distractions", 2234 | availability: 1.0, 2235 | type: "relaxation", 2236 | participants: 1, 2237 | price: 0.0, 2238 | accessibility: "Few to no challenges", 2239 | duration: "minutes", 2240 | kidFriendly: false, 2241 | link: "", 2242 | key: "9908721", 2243 | }, 2244 | { 2245 | activity: "Do a jigsaw puzzle", 2246 | availability: 1.0, 2247 | type: "recreational", 2248 | participants: 1, 2249 | price: 0.1, 2250 | accessibility: "Few to no challenges", 2251 | duration: "minutes", 2252 | kidFriendly: true, 2253 | link: "https://en.wikipedia.org/wiki/Jigsaw_puzzle", 2254 | key: "8550768", 2255 | }, 2256 | { 2257 | activity: "Look at pictures and videos of cute animals", 2258 | availability: 1.0, 2259 | type: "relaxation", 2260 | participants: 1, 2261 | price: 0.0, 2262 | accessibility: "Few to no challenges", 2263 | duration: "minutes", 2264 | kidFriendly: true, 2265 | link: "", 2266 | key: "2565076", 2267 | }, 2268 | { 2269 | activity: "Write a handwritten letter to somebody", 2270 | availability: 0.8, 2271 | type: "social", 2272 | participants: 1, 2273 | price: 0.1, 2274 | accessibility: "Few to no challenges", 2275 | duration: "minutes", 2276 | kidFriendly: true, 2277 | link: "", 2278 | key: "2277801", 2279 | }, 2280 | { 2281 | activity: "Match your storage containers with their lids", 2282 | availability: 1.0, 2283 | type: "busywork", 2284 | participants: 1, 2285 | price: 0.0, 2286 | accessibility: "Few to no challenges", 2287 | duration: "minutes", 2288 | kidFriendly: true, 2289 | link: "", 2290 | key: "4940907", 2291 | }, 2292 | { 2293 | activity: "Start a family tree", 2294 | availability: 1.0, 2295 | type: "social", 2296 | participants: 1, 2297 | price: 0.0, 2298 | accessibility: "Few to no challenges", 2299 | duration: "minutes", 2300 | kidFriendly: true, 2301 | link: "https://en.wikipedia.org/wiki/Family_tree", 2302 | key: "6825484", 2303 | }, 2304 | { 2305 | activity: "Look at your finances and find one way to save money", 2306 | availability: 1.0, 2307 | type: "busywork", 2308 | participants: 1, 2309 | price: 0.0, 2310 | accessibility: "Few to no challenges", 2311 | duration: "minutes", 2312 | kidFriendly: false, 2313 | link: "", 2314 | key: "5977626", 2315 | }, 2316 | { 2317 | activity: "Organize your dresser", 2318 | availability: 1.0, 2319 | type: "busywork", 2320 | participants: 1, 2321 | price: 0.0, 2322 | accessibility: "Few to no challenges", 2323 | duration: "minutes", 2324 | kidFriendly: true, 2325 | link: "", 2326 | key: "7556665", 2327 | }, 2328 | { 2329 | activity: "Learn the periodic table", 2330 | availability: 0.6, 2331 | type: "education", 2332 | participants: 1, 2333 | price: 0.0, 2334 | accessibility: "Few to no challenges", 2335 | duration: "hours", 2336 | kidFriendly: true, 2337 | link: "https://en.wikipedia.org/wiki/Periodic_table", 2338 | key: "3621244", 2339 | }, 2340 | { 2341 | activity: "Improve your touch typing", 2342 | availability: 0.8, 2343 | type: "busywork", 2344 | participants: 1, 2345 | price: 0.0, 2346 | accessibility: "Few to no challenges", 2347 | duration: "hours", 2348 | kidFriendly: false, 2349 | link: "https://en.wikipedia.org/wiki/Touch_typing", 2350 | key: "2526437", 2351 | }, 2352 | { 2353 | activity: "Donate to your local food bank", 2354 | availability: 0.8, 2355 | type: "charity", 2356 | participants: 1, 2357 | price: 0.5, 2358 | accessibility: "Few to no challenges", 2359 | duration: "minutes", 2360 | kidFriendly: true, 2361 | link: "", 2362 | key: "4150284", 2363 | }, 2364 | { 2365 | activity: "Learn how to beatbox", 2366 | availability: 1.0, 2367 | type: "recreational", 2368 | participants: 1, 2369 | price: 0.0, 2370 | accessibility: "Few to no challenges", 2371 | duration: "hours", 2372 | kidFriendly: true, 2373 | link: "https://en.wikipedia.org/wiki/Beatboxing", 2374 | key: "8731710", 2375 | }, 2376 | ], 2377 | }; 2378 | 2379 | //Home Page - API Documentation 2380 | app.get("/", (req, res) => { 2381 | res.render("index.html"); 2382 | }); 2383 | 2384 | //Get a random activity 2385 | app.get("/random", (req, res) => { 2386 | const randomIndex = Math.floor(Math.random() * data.activities.length); 2387 | res.json(data.activities[randomIndex]); 2388 | }); 2389 | 2390 | //Route to retrieve acitivities of a certain type. 2391 | app.get("/filter", (req, res) => { 2392 | let filteredActivities = data.activities; 2393 | 2394 | if (req.query.type) { 2395 | filteredActivities = filteredActivities.filter( 2396 | (activity) => activity.type === req.query.type 2397 | ); 2398 | } 2399 | if (req.query.participants) { 2400 | console.log(req.query.participants); 2401 | filteredActivities = filteredActivities.filter( 2402 | (activity) => activity.participants === parseInt(req.query.participants) 2403 | ); 2404 | } 2405 | 2406 | if (filteredActivities.length > 0) { 2407 | res.json(filteredActivities); 2408 | } else { 2409 | res 2410 | .status(404) 2411 | .json({ error: "Activities not found for the given filter." }); 2412 | } 2413 | }); 2414 | 2415 | // Route to retrieve a specific secret by key 2416 | app.get("/activity/:key", (req, res) => { 2417 | const key = req.params.key; 2418 | data.activities.forEach((activity) => { 2419 | if (activity.key == key) { 2420 | console.log(true); 2421 | res.json(activity); 2422 | } 2423 | }); 2424 | 2425 | res.status(404).json({ error: "Activity not found" }); 2426 | }); 2427 | 2428 | const port = 4000; 2429 | app.listen(port, () => { 2430 | console.log(`Server is running on port ${port}`); 2431 | }); 2432 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "boredapi", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "boredapi", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.18.2", 13 | "express-rate-limit": "^6.7.0" 14 | } 15 | }, 16 | "node_modules/accepts": { 17 | "version": "1.3.8", 18 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 19 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 20 | "dependencies": { 21 | "mime-types": "~2.1.34", 22 | "negotiator": "0.6.3" 23 | }, 24 | "engines": { 25 | "node": ">= 0.6" 26 | } 27 | }, 28 | "node_modules/array-flatten": { 29 | "version": "1.1.1", 30 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 31 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 32 | }, 33 | "node_modules/body-parser": { 34 | "version": "1.20.1", 35 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 36 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 37 | "dependencies": { 38 | "bytes": "3.1.2", 39 | "content-type": "~1.0.4", 40 | "debug": "2.6.9", 41 | "depd": "2.0.0", 42 | "destroy": "1.2.0", 43 | "http-errors": "2.0.0", 44 | "iconv-lite": "0.4.24", 45 | "on-finished": "2.4.1", 46 | "qs": "6.11.0", 47 | "raw-body": "2.5.1", 48 | "type-is": "~1.6.18", 49 | "unpipe": "1.0.0" 50 | }, 51 | "engines": { 52 | "node": ">= 0.8", 53 | "npm": "1.2.8000 || >= 1.4.16" 54 | } 55 | }, 56 | "node_modules/bytes": { 57 | "version": "3.1.2", 58 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 59 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 60 | "engines": { 61 | "node": ">= 0.8" 62 | } 63 | }, 64 | "node_modules/call-bind": { 65 | "version": "1.0.2", 66 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 67 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 68 | "dependencies": { 69 | "function-bind": "^1.1.1", 70 | "get-intrinsic": "^1.0.2" 71 | }, 72 | "funding": { 73 | "url": "https://github.com/sponsors/ljharb" 74 | } 75 | }, 76 | "node_modules/content-disposition": { 77 | "version": "0.5.4", 78 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 79 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 80 | "dependencies": { 81 | "safe-buffer": "5.2.1" 82 | }, 83 | "engines": { 84 | "node": ">= 0.6" 85 | } 86 | }, 87 | "node_modules/content-type": { 88 | "version": "1.0.5", 89 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 90 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 91 | "engines": { 92 | "node": ">= 0.6" 93 | } 94 | }, 95 | "node_modules/cookie": { 96 | "version": "0.5.0", 97 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 98 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 99 | "engines": { 100 | "node": ">= 0.6" 101 | } 102 | }, 103 | "node_modules/cookie-signature": { 104 | "version": "1.0.6", 105 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 106 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 107 | }, 108 | "node_modules/debug": { 109 | "version": "2.6.9", 110 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 111 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 112 | "dependencies": { 113 | "ms": "2.0.0" 114 | } 115 | }, 116 | "node_modules/depd": { 117 | "version": "2.0.0", 118 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 119 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 120 | "engines": { 121 | "node": ">= 0.8" 122 | } 123 | }, 124 | "node_modules/destroy": { 125 | "version": "1.2.0", 126 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 127 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 128 | "engines": { 129 | "node": ">= 0.8", 130 | "npm": "1.2.8000 || >= 1.4.16" 131 | } 132 | }, 133 | "node_modules/ee-first": { 134 | "version": "1.1.1", 135 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 136 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 137 | }, 138 | "node_modules/encodeurl": { 139 | "version": "1.0.2", 140 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 141 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 142 | "engines": { 143 | "node": ">= 0.8" 144 | } 145 | }, 146 | "node_modules/escape-html": { 147 | "version": "1.0.3", 148 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 149 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 150 | }, 151 | "node_modules/etag": { 152 | "version": "1.8.1", 153 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 154 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 155 | "engines": { 156 | "node": ">= 0.6" 157 | } 158 | }, 159 | "node_modules/express": { 160 | "version": "4.18.2", 161 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 162 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 163 | "dependencies": { 164 | "accepts": "~1.3.8", 165 | "array-flatten": "1.1.1", 166 | "body-parser": "1.20.1", 167 | "content-disposition": "0.5.4", 168 | "content-type": "~1.0.4", 169 | "cookie": "0.5.0", 170 | "cookie-signature": "1.0.6", 171 | "debug": "2.6.9", 172 | "depd": "2.0.0", 173 | "encodeurl": "~1.0.2", 174 | "escape-html": "~1.0.3", 175 | "etag": "~1.8.1", 176 | "finalhandler": "1.2.0", 177 | "fresh": "0.5.2", 178 | "http-errors": "2.0.0", 179 | "merge-descriptors": "1.0.1", 180 | "methods": "~1.1.2", 181 | "on-finished": "2.4.1", 182 | "parseurl": "~1.3.3", 183 | "path-to-regexp": "0.1.7", 184 | "proxy-addr": "~2.0.7", 185 | "qs": "6.11.0", 186 | "range-parser": "~1.2.1", 187 | "safe-buffer": "5.2.1", 188 | "send": "0.18.0", 189 | "serve-static": "1.15.0", 190 | "setprototypeof": "1.2.0", 191 | "statuses": "2.0.1", 192 | "type-is": "~1.6.18", 193 | "utils-merge": "1.0.1", 194 | "vary": "~1.1.2" 195 | }, 196 | "engines": { 197 | "node": ">= 0.10.0" 198 | } 199 | }, 200 | "node_modules/express-rate-limit": { 201 | "version": "6.7.0", 202 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", 203 | "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", 204 | "engines": { 205 | "node": ">= 12.9.0" 206 | }, 207 | "peerDependencies": { 208 | "express": "^4 || ^5" 209 | } 210 | }, 211 | "node_modules/finalhandler": { 212 | "version": "1.2.0", 213 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 214 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 215 | "dependencies": { 216 | "debug": "2.6.9", 217 | "encodeurl": "~1.0.2", 218 | "escape-html": "~1.0.3", 219 | "on-finished": "2.4.1", 220 | "parseurl": "~1.3.3", 221 | "statuses": "2.0.1", 222 | "unpipe": "~1.0.0" 223 | }, 224 | "engines": { 225 | "node": ">= 0.8" 226 | } 227 | }, 228 | "node_modules/forwarded": { 229 | "version": "0.2.0", 230 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 231 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 232 | "engines": { 233 | "node": ">= 0.6" 234 | } 235 | }, 236 | "node_modules/fresh": { 237 | "version": "0.5.2", 238 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 239 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 240 | "engines": { 241 | "node": ">= 0.6" 242 | } 243 | }, 244 | "node_modules/function-bind": { 245 | "version": "1.1.1", 246 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 247 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 248 | }, 249 | "node_modules/get-intrinsic": { 250 | "version": "1.2.1", 251 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 252 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 253 | "dependencies": { 254 | "function-bind": "^1.1.1", 255 | "has": "^1.0.3", 256 | "has-proto": "^1.0.1", 257 | "has-symbols": "^1.0.3" 258 | }, 259 | "funding": { 260 | "url": "https://github.com/sponsors/ljharb" 261 | } 262 | }, 263 | "node_modules/has": { 264 | "version": "1.0.3", 265 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 266 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 267 | "dependencies": { 268 | "function-bind": "^1.1.1" 269 | }, 270 | "engines": { 271 | "node": ">= 0.4.0" 272 | } 273 | }, 274 | "node_modules/has-proto": { 275 | "version": "1.0.1", 276 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 277 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 278 | "engines": { 279 | "node": ">= 0.4" 280 | }, 281 | "funding": { 282 | "url": "https://github.com/sponsors/ljharb" 283 | } 284 | }, 285 | "node_modules/has-symbols": { 286 | "version": "1.0.3", 287 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 288 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 289 | "engines": { 290 | "node": ">= 0.4" 291 | }, 292 | "funding": { 293 | "url": "https://github.com/sponsors/ljharb" 294 | } 295 | }, 296 | "node_modules/http-errors": { 297 | "version": "2.0.0", 298 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 299 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 300 | "dependencies": { 301 | "depd": "2.0.0", 302 | "inherits": "2.0.4", 303 | "setprototypeof": "1.2.0", 304 | "statuses": "2.0.1", 305 | "toidentifier": "1.0.1" 306 | }, 307 | "engines": { 308 | "node": ">= 0.8" 309 | } 310 | }, 311 | "node_modules/iconv-lite": { 312 | "version": "0.4.24", 313 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 314 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 315 | "dependencies": { 316 | "safer-buffer": ">= 2.1.2 < 3" 317 | }, 318 | "engines": { 319 | "node": ">=0.10.0" 320 | } 321 | }, 322 | "node_modules/inherits": { 323 | "version": "2.0.4", 324 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 325 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 326 | }, 327 | "node_modules/ipaddr.js": { 328 | "version": "1.9.1", 329 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 330 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 331 | "engines": { 332 | "node": ">= 0.10" 333 | } 334 | }, 335 | "node_modules/media-typer": { 336 | "version": "0.3.0", 337 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 338 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 339 | "engines": { 340 | "node": ">= 0.6" 341 | } 342 | }, 343 | "node_modules/merge-descriptors": { 344 | "version": "1.0.1", 345 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 346 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 347 | }, 348 | "node_modules/methods": { 349 | "version": "1.1.2", 350 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 351 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 352 | "engines": { 353 | "node": ">= 0.6" 354 | } 355 | }, 356 | "node_modules/mime": { 357 | "version": "1.6.0", 358 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 359 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 360 | "bin": { 361 | "mime": "cli.js" 362 | }, 363 | "engines": { 364 | "node": ">=4" 365 | } 366 | }, 367 | "node_modules/mime-db": { 368 | "version": "1.52.0", 369 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 370 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 371 | "engines": { 372 | "node": ">= 0.6" 373 | } 374 | }, 375 | "node_modules/mime-types": { 376 | "version": "2.1.35", 377 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 378 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 379 | "dependencies": { 380 | "mime-db": "1.52.0" 381 | }, 382 | "engines": { 383 | "node": ">= 0.6" 384 | } 385 | }, 386 | "node_modules/ms": { 387 | "version": "2.0.0", 388 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 389 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 390 | }, 391 | "node_modules/negotiator": { 392 | "version": "0.6.3", 393 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 394 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 395 | "engines": { 396 | "node": ">= 0.6" 397 | } 398 | }, 399 | "node_modules/object-inspect": { 400 | "version": "1.12.3", 401 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 402 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 403 | "funding": { 404 | "url": "https://github.com/sponsors/ljharb" 405 | } 406 | }, 407 | "node_modules/on-finished": { 408 | "version": "2.4.1", 409 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 410 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 411 | "dependencies": { 412 | "ee-first": "1.1.1" 413 | }, 414 | "engines": { 415 | "node": ">= 0.8" 416 | } 417 | }, 418 | "node_modules/parseurl": { 419 | "version": "1.3.3", 420 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 421 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 422 | "engines": { 423 | "node": ">= 0.8" 424 | } 425 | }, 426 | "node_modules/path-to-regexp": { 427 | "version": "0.1.7", 428 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 429 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 430 | }, 431 | "node_modules/proxy-addr": { 432 | "version": "2.0.7", 433 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 434 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 435 | "dependencies": { 436 | "forwarded": "0.2.0", 437 | "ipaddr.js": "1.9.1" 438 | }, 439 | "engines": { 440 | "node": ">= 0.10" 441 | } 442 | }, 443 | "node_modules/qs": { 444 | "version": "6.11.0", 445 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 446 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 447 | "dependencies": { 448 | "side-channel": "^1.0.4" 449 | }, 450 | "engines": { 451 | "node": ">=0.6" 452 | }, 453 | "funding": { 454 | "url": "https://github.com/sponsors/ljharb" 455 | } 456 | }, 457 | "node_modules/range-parser": { 458 | "version": "1.2.1", 459 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 460 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 461 | "engines": { 462 | "node": ">= 0.6" 463 | } 464 | }, 465 | "node_modules/raw-body": { 466 | "version": "2.5.1", 467 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 468 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 469 | "dependencies": { 470 | "bytes": "3.1.2", 471 | "http-errors": "2.0.0", 472 | "iconv-lite": "0.4.24", 473 | "unpipe": "1.0.0" 474 | }, 475 | "engines": { 476 | "node": ">= 0.8" 477 | } 478 | }, 479 | "node_modules/safe-buffer": { 480 | "version": "5.2.1", 481 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 482 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 483 | "funding": [ 484 | { 485 | "type": "github", 486 | "url": "https://github.com/sponsors/feross" 487 | }, 488 | { 489 | "type": "patreon", 490 | "url": "https://www.patreon.com/feross" 491 | }, 492 | { 493 | "type": "consulting", 494 | "url": "https://feross.org/support" 495 | } 496 | ] 497 | }, 498 | "node_modules/safer-buffer": { 499 | "version": "2.1.2", 500 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 501 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 502 | }, 503 | "node_modules/send": { 504 | "version": "0.18.0", 505 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 506 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 507 | "dependencies": { 508 | "debug": "2.6.9", 509 | "depd": "2.0.0", 510 | "destroy": "1.2.0", 511 | "encodeurl": "~1.0.2", 512 | "escape-html": "~1.0.3", 513 | "etag": "~1.8.1", 514 | "fresh": "0.5.2", 515 | "http-errors": "2.0.0", 516 | "mime": "1.6.0", 517 | "ms": "2.1.3", 518 | "on-finished": "2.4.1", 519 | "range-parser": "~1.2.1", 520 | "statuses": "2.0.1" 521 | }, 522 | "engines": { 523 | "node": ">= 0.8.0" 524 | } 525 | }, 526 | "node_modules/send/node_modules/ms": { 527 | "version": "2.1.3", 528 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 529 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 530 | }, 531 | "node_modules/serve-static": { 532 | "version": "1.15.0", 533 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 534 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 535 | "dependencies": { 536 | "encodeurl": "~1.0.2", 537 | "escape-html": "~1.0.3", 538 | "parseurl": "~1.3.3", 539 | "send": "0.18.0" 540 | }, 541 | "engines": { 542 | "node": ">= 0.8.0" 543 | } 544 | }, 545 | "node_modules/setprototypeof": { 546 | "version": "1.2.0", 547 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 548 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 549 | }, 550 | "node_modules/side-channel": { 551 | "version": "1.0.4", 552 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 553 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 554 | "dependencies": { 555 | "call-bind": "^1.0.0", 556 | "get-intrinsic": "^1.0.2", 557 | "object-inspect": "^1.9.0" 558 | }, 559 | "funding": { 560 | "url": "https://github.com/sponsors/ljharb" 561 | } 562 | }, 563 | "node_modules/statuses": { 564 | "version": "2.0.1", 565 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 566 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 567 | "engines": { 568 | "node": ">= 0.8" 569 | } 570 | }, 571 | "node_modules/toidentifier": { 572 | "version": "1.0.1", 573 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 574 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 575 | "engines": { 576 | "node": ">=0.6" 577 | } 578 | }, 579 | "node_modules/type-is": { 580 | "version": "1.6.18", 581 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 582 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 583 | "dependencies": { 584 | "media-typer": "0.3.0", 585 | "mime-types": "~2.1.24" 586 | }, 587 | "engines": { 588 | "node": ">= 0.6" 589 | } 590 | }, 591 | "node_modules/unpipe": { 592 | "version": "1.0.0", 593 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 594 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 595 | "engines": { 596 | "node": ">= 0.8" 597 | } 598 | }, 599 | "node_modules/utils-merge": { 600 | "version": "1.0.1", 601 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 602 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 603 | "engines": { 604 | "node": ">= 0.4.0" 605 | } 606 | }, 607 | "node_modules/vary": { 608 | "version": "1.1.2", 609 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 610 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 611 | "engines": { 612 | "node": ">= 0.8" 613 | } 614 | } 615 | } 616 | } 617 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "boredapi", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.18.2", 14 | "express-rate-limit": "^6.7.0", 15 | "ejs": "^3.1.9" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /views/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bored API Documentation 6 | 83 | 84 | 85 | 86 |

Bored API Documentation

87 |

Welcome to the Bored API by the App Brewery. This is a teaching tool for students of the App Brewery. API Requests 88 | are rate limited to 100 requests every 15 minutes.

89 |
90 |

Get a Random Activity

91 |

Returns a randomly selected activity from the available activities.

92 |
93 |

Example Request:

94 |
95 | GET https://bored-api.appbrewery.com/random 96 |
97 |

Example Response:

98 |
99 |
{
100 |   "activity": "Learn Express.js",
101 |   "availability": 0.25,
102 |   "type": "education",
103 |   "participants": 1,
104 |   "price": 0.1,
105 |   "accessibility": "Few to no challenges",
106 |   "duration": "hours",
107 |   "kidFriendly": true,
108 |   "link": "https://expressjs.com/",
109 |   "key": "3943506"
110 | }
111 |
112 |
113 |
114 | 115 |
116 |

Filter Activities

117 |

Returns a list of activities filtered by type and/or participants.

118 |

Query Parameters:

119 | 126 |
127 |

Example Request:

128 |
129 | GET https://bored-api.appbrewery.com/filter?type=education 130 |
131 |

Example Response:

132 |
133 |
[
134 |   {
135 |     "activity": "Learn Express.js",
136 |     "availability": 0.25,
137 |     "type": "education",
138 |     "participants": 1,
139 |     "price": 0.1,
140 |     "accessibility": "Few to no challenges",
141 |     "duration": "hours",
142 |     "kidFriendly": true,
143 |     "link": "https://expressjs.com/",
144 |     "key": "3943506"
145 |   },
146 |   {
147 |     "activity": "Learn React.js",
148 |     "availability": 0.5,
149 |     "type": "education",
150 |     "participants": 1,
151 |     "price": 0.2,
152 |     "accessibility": "Some challenges",
153 |     "duration": "hours",
154 |     "kidFriendly": true,
155 |     "link": "https://reactjs.org/",
156 |     "key": "7890123"
157 |   }
158 | ]
159 |
160 |
161 |
162 | 163 |
164 |

Get Activity by Key

165 |

Returns the activity with the specified key.

166 |

URL Parameters:

167 | 170 |
171 |

Example Request:

172 |
173 | GET https://bored-api.appbrewery.com/activity/3943506 174 |
175 |

Example Response:

176 |
177 |
{
178 |   "activity": "Learn Express.js",
179 |   "availability": 0.25,
180 |   "type": "education",
181 |   "participants": 1,
182 |   "price": 0.1,
183 |   "accessibility": "Few to no challenges",
184 |   "duration": "hours",
185 |   "kidFriendly": true,
186 |   "link": "https://expressjs.com/",
187 |   "key": "3943506"
188 | }
189 |
190 |
191 |
192 | 193 | 194 | 197 | 198 | --------------------------------------------------------------------------------