-
ISRO 🚀 API
+
ISRO API
- Open Source API for Launched Spacecrafts & Rockets data of ISRO
+ Open Source API for ISRO spacecraft, launcher, and mission data
API End-Points
Contribute at GitHub
diff --git a/isro_scrape/isro_spacecrafts_scraper_output.json b/isro_scrape/isro_spacecrafts_scraper_output.json
new file mode 100644
index 0000000..5866923
--- /dev/null
+++ b/isro_scrape/isro_spacecrafts_scraper_output.json
@@ -0,0 +1,822 @@
+[
+ {
+ "name": "\n\n Aryabhata\n \n",
+ "id": 1,
+ "mission": "Scientific/ Experimental",
+ "weight": "360 kg",
+ "on_board_power": "46 Watts",
+ "communication": "VHF band",
+ "stabilization": "Spinstabilize",
+ "payload": "X-ray Astronomy Aeronomy & Solar Physics",
+ "launch_date": "April 19, 1975",
+ "launch_site": "Volgograd Launch Station (presently in Russia)",
+ "launch_vehicle": "C-1 Intercosmos",
+ "orbit": "563 x 619 km",
+ "inclination": "50.7 deg",
+ "mission_life": "6 months(nominal), Spacecraft mainframe active till March,1981",
+ "orbital_life": "Nearly seventeen years (Re-entered on February 10,1992)"
+ },
+ {
+ "name": "\n\n Bhaskara-I\n \n",
+ "id": 2,
+ "mission": "Experimental Remote Sensing",
+ "weight": "442 kg",
+ "onboard_power": "47 Watts",
+ "communication": "VHF band",
+ "stabilization": "Spin stabilized (spin axis controlled)",
+ "payload": "TVcameras, three band Microwave Radiometer (SAMIR)",
+ "launch_date": "Jun 07,1979",
+ "launch_site": "Volgograd Launch Station (presently in Russia)",
+ "launch_vehicle": "C-1Intercosmos",
+ "orbit": "519 x 541 km",
+ "inclination": "50.6 deg",
+ "mission_life": "One year (nominal)",
+ "orbital_life": "About 10 years ( Re-entered in 1989 )"
+ },
+ {
+ "name": "\n\n Rohini Technology Payload\n (RTP)\n \n",
+ "id": 3,
+ "mission": "Experimental",
+ "weight": "35 kg",
+ "onboard_power": "3 Watts",
+ "communication": "VHF band",
+ "stabilization": "Spin stabilized (spin axis controlled)",
+ "payload": "Launch vehicle monitoring instruments",
+ "launch_date": "August 10,1979",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "SLV-3",
+ "orbit": "Not achieved"
+ },
+ {
+ "name": "\n\n Rohini Satellite RS-1\n \n",
+ "id": 4,
+ "mission": "Experimental",
+ "weight": "35 kg",
+ "onboard_power": "16 Watts",
+ "communication": "VHF band",
+ "stabilization": "Spin stabilized",
+ "payload": "Launch vehicle monitoring instruments",
+ "launch_date": "July 18,1980",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "SLV-3",
+ "orbit": "305 x 919 km",
+ "inclination": "44.7 deg.",
+ "mission_life": "1.2 years",
+ "orbital_life": "20 months"
+ },
+ {
+ "name": "\n\n Rohini Satellite RS-D1\n \n",
+ "id": 5,
+ "mission": "Experimental",
+ "weight": "38 kg",
+ "onboard_power": "16 Watts",
+ "communication": "VHF band",
+ "stabilization": "Spin stabilized",
+ "payload": "Landmark Tracker ( remote sensing payload)",
+ "launch_date": "May 31,1981",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "SLV-3",
+ "orbit": "186 x 418 km (achieved)",
+ "inclination": "46 deg",
+ "orbital_life": "Nine days"
+ },
+ {
+ "name": "\n\n APPLE\n \n",
+ "id": 6,
+ "mission": "Experimental geostationary communication",
+ "weight": "670 kg",
+ "onboard_power": "210 Watts",
+ "communication": "VHF and C-band",
+ "stabilization": "Three axis stabilized (biased momentum) with Momentum Wheels, Torquers & \u00a0Hydrazine based Reaction control system",
+ "payload": "C - band transponders (Two)",
+ "launch_date": "June19,1981",
+ "launch_site": "Kourou (CSG), French Guyana",
+ "launch_vehicle": "Ariane -1(V-3)",
+ "orbit": "Geosynchronous (102 deg. E\u00a0 longitude, over Indonesia)",
+ "inclination": "Near zero",
+ "mission_life": "Two years"
+ },
+ {
+ "name": "\n\n Bhaskara-II\n \n",
+ "id": 7,
+ "mission": "Experimental Remote Sensing",
+ "weight": "444 kg",
+ "onboard_power": "47 Watts",
+ "communication": "VHF band",
+ "stabilization": "Spin stabilized (spin axis controlled)",
+ "payload": "TV cameras, three band Microwave Radiometer (SAMIR)",
+ "launch_date": "Nov 20, 1981",
+ "launch_site": "Volgograd Launch Station (presently in Russia)",
+ "launch_vehicle": "C-1 Intercosmos",
+ "orbit": "541 x 557 km",
+ "inclination": "50.7o",
+ "mission_life": "One year (nominal)",
+ "orbital_life": "About 10 years ( Re-entered in 1991 )"
+ },
+ {
+ "name": "\n\n Rohini Satellite RS-D2\n \n",
+ "id": 8,
+ "mission": "Experimental",
+ "weight": "41.5 kg",
+ "onboard_power": "16 Watts",
+ "communication": "VHF band",
+ "stabilization": "Spin stabilized",
+ "payload": "Smart sensor (remote sensing payload), L-band beacon",
+ "launch_date": "April 17, 1983",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "SLV-3",
+ "orbit": "371 x 861 km",
+ "inclination": "46o",
+ "mission_life": "17 months",
+ "orbital_life": "Seven years (Re-entered on April 19, 1990)"
+ },
+ {
+ "name": "\n\n SROSS-1\n \n",
+ "id": 9,
+ "mission": "Experimental",
+ "weight": "150 kg",
+ "onboard_power": "90 Watts",
+ "communication": "S-band and VHF",
+ "stabilization": "Three axis body stabilized (biased momentum) with a Momentum Wheel and Magnetic Torquer",
+ "propulsion_system": "Monopropellant (Hydrazine based) Reaction control system",
+ "payload": "Launch Vehicle Monitoring Platform(LVMP), Gamma Ray Burst (GRB) payload and Corner Cube Retro Reflector (CCRR) for laser tracking",
+ "launch_date": "March 24, 1987",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "Augmented Satellite Launch Vehicle (ASLV)",
+ "orbital_life": "Not realised"
+ },
+ {
+ "name": "\n\n IRS-1A\n \n",
+ "id": 10,
+ "mission": "Operational Remote Sensing",
+ "weight": "975 kg",
+ "onboard_power": "600 Watts",
+ "communication": "S-band, X-band and VHF(commanding only)",
+ "stabilization": "Three axis body stabilized (zero momentum) with 4 Reactions Wheels, Magnetic torquers",
+ "rcs": "Monopropellant Hydrazine based with sixteen 1 Newton thrusters",
+ "payload": "Three solid state Push Broom Cameras: LISS-1(72.5 metre resolution), LISS-2A and LISS-2B (36.25 metre resolution)",
+ "launch_date": "March 17, 1988",
+ "launch_site": "Baikanur Cosmodrome Kazakhstan",
+ "launch_vehicle": "Vostok",
+ "orbit": "904 km Polar Sun-synchronous",
+ "inclination": "99.08o",
+ "repetivity": "22 days (307 orbits)",
+ "local_time": "10.30 a.m. (descending node)",
+ "mission_completed_during": "July 1996"
+ },
+ {
+ "name": "\n\n SROSS-2\n \n",
+ "id": 11,
+ "mission": "Experimental",
+ "weight": "150 kg",
+ "onboard_power": "90 Watts",
+ "communication": "S-band and VHF",
+ "stabilization": "Three axis body stabilized (biased momentum) with a Momentum Wheel and Magnetic Torquer",
+ "propulsion_system": "Monopropellant (Hydrazine based) Reaction Control System",
+ "payload": "Gamma Ray Burst (GRB) payload and Mono Payload Ocular Electro-Optic Stereo Scanner (MEOSS) built by DLR, Germany",
+ "launch_date": "July 13, 1988",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "Augmented Satellite Launch Vehicle (ASLV)",
+ "orbit": "Not realised"
+ },
+ {
+ "name": "\n\n IRS-1B\n \n",
+ "id": 12,
+ "mission": "Operational Remote Sensing",
+ "weight": "975 kg",
+ "onboard_power": "600 Watts",
+ "communication": "S-band, X-band and VHF (commanding only)",
+ "stabilization": "Three axis body stabilized (zero momentum) with 4 Reactions Wheels, Magnetic torquers",
+ "rcs": "Monopropellant Hydrazine based with sixteen 1 Newton thrusters",
+ "payload": "Three solid state Push Broom Cameras LlSS-1 (72.5 metre resolution), LlSS-2A and LlSS-2B (36.25 metre resolution)",
+ "launch_date": "August 29, 1991",
+ "launch_site": "Baikanur Cosmodrome Kazakhstan",
+ "launch_vehicle": "Vostok",
+ "orbit": "904 km Polar Sun Synchronous",
+ "inclination": "99.08o",
+ "repetivity": "22 days",
+ "local_time": "10.30 a.m. (descending node)",
+ "mission_completed_on": "December 20, 2003"
+ },
+ {
+ "name": "\n\n SROSS-C\n \n",
+ "id": 13,
+ "mission": "Experimental",
+ "weight": "106.1 kg",
+ "onboard_power": "45 Watts",
+ "communication": "S-band and VHF",
+ "stabilization": "Spin stabilized with a Magnetic Torquer and Magnetic Bias Control",
+ "payload": "Gamma Ray Burst (GRB) experiment & Retarding Potential Analyser (RPA) experiment",
+ "launch_date": "May 20,1992",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "Augmented Satellite Launch Vehicle (ASLV)",
+ "orbit": "267 x 391 km",
+ "mission_life": "Two months (Re-entered on July15,1992)"
+ },
+ {
+ "name": "\n\n INSAT-2A\n \n",
+ "id": 14,
+ "mission": "Multipurpose Communication, meteorology and Satellite based search and rescue",
+ "weight": "1906 kg with propellant 916 kg dry weight",
+ "onboard_power": "One KW approx",
+ "communication": "C, extended C and S band",
+ "stabilization": "Three axis body stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers",
+ "propulsion": "Integrated bipropellant system (MMH and N2 04) With sixteen 22 N thrusters and 440 LAM.",
+ "payload": "Transponders: 12 C-band (for FSS),6 ext. C-band (for FSS) 2 S-band (for BSS),1Data relay transponder (for met.data), 1 transponder for research and rescue, Very High Resolution radiometer (VHRR) for\u00a0meteorological observation with 2 km resolution in the visible and 8 km resolution in the IR band",
+ "launch_date": "July 10,1992",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane 4",
+ "orbit": "Geostationary 74oE longitude",
+ "inclination": "0o",
+ "mission_life": "Seven years(nominal)",
+ "orbit_life": "Very Long"
+ },
+ {
+ "name": "\n\n INSAT-2B\n \n",
+ "id": 15,
+ "mission": "Multipurpose Communication, meteorology and Satellite based search and rescue",
+ "weight": "1906 kg with propellant 916 kg dry weight",
+ "onboard_power": "One KW approx.",
+ "communication": "C, extended C and S band",
+ "stabilization": "Three axis body stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers",
+ "propulsion": "Integrated bipropellant system ( MMH and N2 04) With sixteen 22 N thrusters and 440 N LAM.",
+ "payload": "Transponders: 12C-band (for FSS),6 ext. C-band (for FSS) 2S-band (for BSS),1Data relay transponder (for met.data), 1 transponder for research and rescue, Very High Resolution radiometer (VHRR) for meteorological observation with 2 km resolution in the visible and 8 km resolution in the IR band",
+ "launch_date": "July 23, 1993",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane 4",
+ "orbit": "Geostationary 93.5o E",
+ "inclination": "0o",
+ "mission_life": "Seven years(nominal)",
+ "orbit_life": "Very Long"
+ },
+ {
+ "name": "\n\n IRS-1E\n \n",
+ "id": 16,
+ "mission": "Operational Remote Sensing",
+ "weight": "846 kg",
+ "onboard_power": "415 Watts",
+ "communication": "S-band (TIC) & VHF",
+ "stabilization": "Three axis body stabilized ( zero momentum) with 4 Reaction Wheels, Magnetic torquers",
+ "rcs": "Monopropellant Hydrazine based RCS with 1 Newton thrusters ( 16 Nos.)",
+ "payload": "LlSS-1 MEOSS (Mono-ocula Erlectro Optic Stereo Scanner)",
+ "launch_date": "September 20, 1993",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV-D1",
+ "orbit": "Not realised"
+ },
+ {
+ "name": "\n\n SROSS-C2\n \n",
+ "id": 17,
+ "mission": "Experimental",
+ "weight": "115 kg",
+ "onboard_power": "45 Watts",
+ "communication": "S-band and VHF",
+ "rcs": "Monopropellant Hydrazine based with six 1 Newton thrusters",
+ "payload": "Gamma Ray Burst (GRB) & Retarding Potential Analyser (RPA)",
+ "launch_date": "May 04,1994",
+ "launch_site": "SHAR Centre,Sriharikota,India",
+ "launch_vehicle": "Augmented Satellite Launch Vehicle (ASLV)",
+ "orbit": "430 x 600 km.",
+ "inclination": "45 deg.",
+ "mission_life": "Six months (nominal)",
+ "orbital_life": "Two years (nominal)"
+ },
+ {
+ "name": "\n\n IRS-P2\n \n",
+ "id": 18,
+ "mission": "Operational Remote Sensing",
+ "weight": "804 kg",
+ "onboard_power": "510 Watts",
+ "communication": "S-band, X-band",
+ "stabilization": "Three axis body stabilized with 4 Reaction Wheels, Magnetic torquers",
+ "rcs": "4 tanks containing Monopropellant Hydrazine based with sixteen 1 N thrusters and one 11 N thruster",
+ "payload": "Two solid state Push Broom Cameras operating in four spectral bands in the visible and near-IR range using CCD arrays: LlSS-2A & LlSS-2B (Resolution: 32.74 metre)",
+ "launch_date": "October 15, 1994",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV-D2",
+ "inclination": "98.68 o",
+ "repetivity": "24 days",
+ "mission_completed_on": "1997"
+ },
+ {
+ "name": "\n\n INSAT-2C\n \n",
+ "id": 19,
+ "mission": "Communication",
+ "weight": "2106 kg with propellants 946 kg dry weight",
+ "onboard_power": "1320 Watts",
+ "communication": "C extended C, S and Ku bands",
+ "stabilization": "Three axis stabilized with two Momen'tum Wheels & one Reaction Wheel, Magnetic torquers",
+ "propulsion": "Integrated bipropellant system ( MMH and N2 04) With sixteen 22N thrusters and 440N LAM.",
+ "payload": "Transponders: 16C-band / extended C-band transponders (for FSS), 2 high power C-band transponders (for BSS), 1S-band transponder (for BSS),1C/S-band mobile communication transponder, 3 Ku-band transponders",
+ "launch_date": "December 7, 1995",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane4",
+ "orbit": "Geostationary 93.5 deg E",
+ "inclination": "0 deg.",
+ "mission_life": "Seven years(nominal)",
+ "orbit_life": "Very Long"
+ },
+ {
+ "name": "\n\n IRS-1C\n \n",
+ "id": 20,
+ "mission": "Operational Remote Sensing",
+ "weight": "1250 kg",
+ "onboard_power": "809 Watts (generated by 9.6 sq.metres Solar Panels)",
+ "communication": "S-band, X-band",
+ "stabilization": "Three axis body stabilized (zero momentum) with 4 Reaction Wheels, Magnetic torquer",
+ "rcs": "Monopropellant Hydrazine based with sixteen 1 N thrusters & one 11N thrusters",
+ "payload": "Three solid state Push Broom Cameras: PAN (<6 metre solution )LlSS-3(23.6 metre resolution) and WiFS (189 metre resolution)",
+ "onboard_tape_recorder": "Storage Capacity : 62 G bits",
+ "launch_date": "December 28, 1995",
+ "launch_site": "Baikanur Cosmodrome Kazakhstan",
+ "launch_vehicle": "Molniya",
+ "orbit": "817 km Polar Sun-synchronous",
+ "inclination": "98.69o",
+ "repetivity": "24 days",
+ "local_time": "10.30 a.m",
+ "mission_completed_on": "September 21, 2007"
+ },
+ {
+ "name": "\n\n IRS-P3\n \n",
+ "id": 21,
+ "mission": "Remote sensing of earth's natural resources. Study of X-ray Astronomy. Periodic calibration of PSLV tracking radar located at tracking stations.",
+ "weight": "920 kg",
+ "onboard_power": "817 Watts",
+ "communication": "S-band",
+ "stabilization": "Three axis body stabilized",
+ "rcs": "Combinations of bladder type and surface tension type mass expulsion monopropellant hydrazine system",
+ "payload": "WideField Sensor (WiFS), Modular Opto - electronic Scanner (MOS), Indian X-ray Astronomy Experiment (IXAE), C-band transponder(CBT)",
+ "launch_date": "March 21, 1996",
+ "launch_site": "SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV-D3",
+ "orbit": "817 km. Circular polar sun-synchronous with equatorial crossing at 10.30 am (descending node)",
+ "inclination": "98.68o",
+ "repetivity": "WiFS : 5 days",
+ "mission_completed_during": "January 2006"
+ },
+ {
+ "name": "\n\n INSAT-2D\n \n",
+ "id": 22,
+ "mission": "Communication",
+ "weight": "2079 kg with propellants, 995 kg dry weight",
+ "onboard_power": "1650 Watts",
+ "communication": "C, extended C, S and Ku bands",
+ "stabilization": "Three axis stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers",
+ "propulsion": "Integrated bipropellan stystem ( MMH and N2 04) With sixteen 22N thrusters and 440N LAM.",
+ "payload": "Transponders: 16C-band / extended C-band transponders (forFSS), 2 high power C-band transponders (for BSS), 1S-band transponder (for BSS),1C/S-band mobile communication transponder, 3 Ku-band transponders",
+ "launch_date": "June 4, 1997",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Arianev 4",
+ "orbit": "Geostationary 93,.5deg.E",
+ "inclination": "0 deg."
+ },
+ {
+ "name": "\n\n IRS-1D\n \n",
+ "id": 23,
+ "mission": "Operational Remote Sensing",
+ "weight": "1250 kg",
+ "onboard_power": "809 Watts (generated by 9.6 sq.metres Solar Panels)",
+ "communication": "S-band, X-band",
+ "stabilization": "Three axis body stabilized (zero momentum) with 4 Reaction Wheels, Magnetic torquer",
+ "rcs": "Monopropellant Hydrazine based with sixteen 1 N thrusters & one 11N thrusters",
+ "payload": "Three solid state Push Broom Cameras: PAN (<6 metre solution )LlSS-3(23.6 metre resolution) and WiFS (189 metre resolution)",
+ "onboard_tape_recorder": "Storage Capacity : 62 G bits",
+ "launch_date": "December 28, 1995",
+ "launch_site": "Baikanur Cosmodrome Kazakhstan",
+ "launch_vehicle": "Molniya",
+ "orbit": "817 km Polar Sun-synchronous",
+ "inclination": "98.69 o",
+ "repetivity": "24 days",
+ "local_time": "10.30 a.m",
+ "mission_completed_on": "September 21, 2007"
+ },
+ {
+ "name": "\n\n INSAT-2E\n \n",
+ "id": 24,
+ "mission": "Communication and Meteorology",
+ "spacecraft_mass": "2,550 kg (Mass at Lift-off) 1150 kg (Dry mass)",
+ "launch_date": "03 April 1999",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane \u2013 42P",
+ "orbit": "Geosynchronous (83 deg east longitude)"
+ },
+ {
+ "name": "\n\n Oceansat(IRS-P4)\n \n",
+ "id": 25,
+ "launch_date": "May 26, 1999",
+ "launch_site": "SHAR, Sriharikota",
+ "launch_vehicle": "PSLV - C2",
+ "orbit": "Polar Sun Synchronous",
+ "altitude": "720 km",
+ "inclination": "98.28 deg",
+ "period": "99.31 min",
+ "local_time_of_eq._crossing": "12 noon",
+ "repetitivity_cycle": "2 days",
+ "size": "2.8m x 1.98m x 2.57m",
+ "mass_at_lift_off": "1050 kg",
+ "length_when_fully_deployed": "11.67 m",
+ "attitude_and_orbit_control": "3-axis body-stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters",
+ "power": "9.6 Sq.m Solar Array generating 750w Two 21 Ah Ni-Cd Batteries",
+ "mission_completed_on": "August 8, 2010"
+ },
+ {
+ "name": "\n\n INSAT-3B\n \n",
+ "id": 26,
+ "mission": "Very long",
+ "spacecraft_mass": "2,070 (Mass at Lift \u2013 off) 970 kg (Dry mass)",
+ "onboard_power": "1,712 W",
+ "stabilization": "3 \u2013 axis body stabilised biased momentum control system using earth sensors, sun sensors, inertial reference unit, momentum / reaction wheels, magnetic torquers and unified bi-propellant thrusters.",
+ "propulsion": "Liquid Apogee Motor with fuel and oxidizer stored in separate titanium tanks and pressurant in Kevlar wound titanium tank.",
+ "payload": "12 extended C \u2013 band Transponders Five Ku band Transponders Mobile Satellite Services (MSS)",
+ "launch_date": "22nd March 2000",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane -5",
+ "orbit": "Geostationary (83 deg East longitude)",
+ "inclination": "7 deg"
+ },
+ {
+ "name": "\n PSLV-C3 / TES\n ",
+ "id": 27,
+ "launch_date": "22 October 2001",
+ "launch_site": "SHAR Centre Sriharikota India",
+ "launch_vehicle": "PSLV- C3",
+ "orbit": "572 km Sun Synchronous",
+ "payloads": "PAN"
+ },
+ {
+ "name": "\n\n The Technology Experiment Satellite\n (TES)\n \n",
+ "id": 28,
+ "launch_date": "22 October 2001",
+ "launch_site": "SHAR Centre Sriharikota India",
+ "launch_vehicle": "PSLV- C3",
+ "orbit": "572 km Sun Synchronous",
+ "payloads": "PAN"
+ },
+ {
+ "name": "\n\n INSAT-3C\n \n",
+ "id": 29,
+ "mission": "Communication, broadcasting and Meteorology",
+ "spacecraft_mass": "2,650 kg (Mass at Lift - off) 1218 kg (Dry mass)",
+ "onboard_power": "2765 W",
+ "propulsion": "Liquid Apogee Motor with fuel and oxidizer stored in separate titanium tanks and pressurant in Kevlar wound titanium tank.",
+ "payload": "24 C band transponders 6 Extended C - band Transponders 2 S - band Transponders",
+ "launch_date": "January 24, 2002",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane5-V147",
+ "orbit": "Geostationary (74o longitude)",
+ "mission_life": "Very long"
+ },
+ {
+ "name": "\n\n KALPANA-1\n \n",
+ "id": 30,
+ "mission": "7 Years",
+ "spacecraft_mass": "1060 kg mass (at Lift \u2013 off) 498 kg (Dry mass)",
+ "onboard_power": "550 W",
+ "payload": "Very High Resolution Radiometer (VHRR) Data Relay Transponder (DRT)",
+ "launch_date": "12 September 2002",
+ "launch_site": "SHAR, Sriharikota",
+ "launch_vehicle": "PSLV \u2013 C4",
+ "orbit": "Geostationary (74 deg East longitude)"
+ },
+ {
+ "name": "\n\n INSAT-3A\n \n",
+ "id": 31,
+ "mission": "Telecommunication, broadcasting and Meteorology",
+ "spacecraft_mass": "2,950 kg (Mass at Lift\u2013off) 1,348 kg (Dry mass)",
+ "onboard_power": "3,100 W",
+ "stabilization": "3 \u2013 axis body stabilised in orbit using momentum and reaction wheels, solar flaps, magnetic torquers and eight 10 N and eight 22 N reaction control thrusters",
+ "propulsion": "440 N Liquid Apogee Motor with MON-3 (Mixed Oxides of Nitrogen) and MMH (Mono Methyl Hydrazine) for orbit raising",
+ "payload": "Communication payload - 12 C \u2013 band transponders, - 6 upper extended C band transponders - 6 Ku band transponders - 1 Satellite Aided Search & Rescue transponders Meteorological payload - Very High Resolution Radiometer (VHRR) with 2 km resolution in visible band and 8 km resolution in infrared and water vapour band - Charged Coupled Device (CCD) camera operating in visible, near infrared and shortwave infrared band with 1 km resolution. - Data Relay Transponders (DRT)",
+ "launch_date": "April 10, 2003",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane5-V160",
+ "orbit": "Geostationary (93.5o E longitude)",
+ "mission_life": "12 Years"
+ },
+ {
+ "name": "\n\n INSAT-3E\n \n",
+ "id": 32,
+ "mission": "Communication",
+ "spacecraft_mass": "2,775 kg (Mass at Lift-off) 1218 kg (Dry mass)",
+ "launch_date": "September 28, 2003",
+ "launch_site": "French Guyana",
+ "launch_vehicle": "Ariane5-V162",
+ "orbit": "Geostationary Orbit"
+ },
+ {
+ "name": "\n\n IRS-P6 / RESOURCESAT-1\n \n",
+ "id": 33,
+ "launch_date": "October 17, 2003",
+ "launch_site": "SHAR, Sriharikota",
+ "launch_vehicle": "PSLV-C5",
+ "payloads": "LISS-4, LISS-3, AWiFS-A, AWiFS-B",
+ "orbit": "Polar Sun Synchronous",
+ "orbit_height": "817 km",
+ "orbit_inclination": "98.7 o",
+ "orbit_period": "101.35 min",
+ "number_of_orbits_per_day": "14",
+ "local_time_of_equator_crossing": "10:30 am",
+ "repetivity_(liss-3)": "24 days",
+ "revisit": "5 days",
+ "lift-off_mass": "1360 kg",
+ "attitude_and_orbit_control": "3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters",
+ "power": "Solar Array generating 1250 W, Two 24 Ah Ni-Cd batteries",
+ "mission_life": "5 years"
+ },
+ {
+ "name": "\n\n EDUSAT\n \n",
+ "id": 34,
+ "mission": "Education",
+ "spacecraft_mass": "1950.5 kg mass (at Lift - off) 819.4 kg (Dry mass)",
+ "onboard_power": "Total four solar panel of size 2.54 M x 1.525 M generating 2040 W (EOL), two 24 AH NiCd batteries for eclipse support",
+ "stabilization": "3 axis body stabilised in orbit using sensors, momentum and reaction wheels, magnetic torquers and eight 10 N & 22N reaction control thrusters.",
+ "propulsion": "440 N Liquid Apogee Motor with MON - 3 and MMH for orbit raising",
+ "payload": "Six upper extended C - band transponders Five lower Ku band transponders with regional beam coverage One lower Ku band National beam transponder with Indian main land coverage Ku beacon 12 C band high power transponders with extended coverage, covering southeast and northwest region apart from Indian main land using 63 W LTWTAs",
+ "launch_date": "September 20, 2004",
+ "launch_site": "SHAR, Sriharikota, India",
+ "launch_vehicle": "GSLV-F01",
+ "orbit": "Geostationary (74 o E longitude)",
+ "mission_life": "7 Years (minimum)"
+ },
+ {
+ "name": "\n\n CARTOSAT-1\n \n",
+ "id": 35,
+ "launch_date": "5 May 2005",
+ "launch_site": "SHAR Centre Sriharikota India",
+ "launch_vehicle": "PSLV- C6",
+ "orbit": "618 km Polar Sun Synchronous",
+ "payloads": "PAN FORE, PAN - AFT",
+ "orbit_period": "97 min",
+ "number_of_orbits_per_day": "14",
+ "local_time_of_equator_crossing": "10:30 am",
+ "repetivity": "126 days",
+ "revisit": "5 days",
+ "lift-off_mass": "1560 kg",
+ "attitude_and_orbit_control": "3-axis body stabillised using reaction wheels, Magnetic Torquers and Hydrazine Thrusters",
+ "electrical_power": "15 sqm Solar Array generating 1100w, Two 24 Ah Ni-Cd batteries",
+ "mission_life": "5 years"
+ },
+ {
+ "name": "\n\n INSAT-4A\n \n",
+ "id": 36,
+ "spacecraft_mass": "Lift off 3081 Kg Dry Mass 1386.55 Kg",
+ "orbit": "Geostationary ( 83o E)",
+ "power": "Solar Array to provide a power of 5922 W",
+ "battery": "Three 70 Ah Ni H2 Batteries for eclipse support of 4264 W",
+ "life": "12 Years",
+ "launch_date": "December 22, 2005",
+ "launch_vehicle": "ARIANE5-V169"
+ },
+ {
+ "name": "\n\n CARTOSAT-2\n \n",
+ "id": 37,
+ "mission": "Remote Sensing",
+ "weight": "650 Kg",
+ "onboard_orbit": "900 Watts",
+ "stabilization": "3 - axis body stabilised using high torque reaction wheels, magnetic torquers and thrusters",
+ "payloads": "Panchromatic Camera",
+ "launch_date": "10 January 2007",
+ "launch_site": "SHAR Centre Sriharikota India",
+ "launch_vehicle": "PSLV- C7",
+ "orbit": "Polar Sun Synchronous",
+ "mission_life": "5 years"
+ },
+ {
+ "name": "\n\n INSAT-4B\n \n",
+ "id": 38,
+ "mission": "Communication",
+ "weight": "3025 kg (at Lift \u2013 off)",
+ "onboard_power": "5859 W",
+ "stabilization": "It uses 3 earth sensors, 2 digital sun sensors, 8 coarse analog sun sensors, 3 solar panel sun sensors and one sensor processing electronics. The wheels and wheel drive electronics were imported with indigenous wheel interface module to interface the wheel drive electronics and AOCE.",
+ "propulsion": "The propulsion system is employing 16 thrusters, 4 each located on east, west and AY sides and 2 each on north and south sides. There is one 440 N liquid apogee motor (using Mono Methyl Hydrazine (MMH) as fuel and oxides of Nitrogen (MON3 as oxidizer) and three pressurant tanks mounted on the LAM deck.",
+ "payload": "12 Ku band high power transponders covering Indian main land using 140W radiatively cooled TWTAs.",
+ "launch_date": "March 12, 2007",
+ "launch_site": "French Guiana",
+ "launch_vehicle": "Ariane5",
+ "orbit": "Geostationary (93.5 o E Longitude)",
+ "mission_life": "12 Years"
+ },
+ {
+ "name": "\n\n INSAT-4CR\n \n",
+ "id": 39,
+ "mission": "Communication",
+ "weight": "2,130 kg (Mass at Lift \u2013 off)",
+ "onboard_power": "3000 W",
+ "communication_payload": "12 Ku-band transponders employing 140 W Traveling Wave Tube Amplifiers (TWTA) Ku-band Beacon",
+ "launch_date": "September 2, 2007",
+ "launch_site": "SHAR, Sriharikota, India",
+ "launch_vehicle": "GSLV-F04",
+ "orbit": "Geosynchronous (74\u00b0 E)",
+ "mission_life": "12 Years"
+ },
+ {
+ "name": "\n\n CARTOSAT \u2013\n 2A\n \n",
+ "id": 40,
+ "mission": "Remote Sensing",
+ "weight": "690 Kg (Mass at lift off)",
+ "onboard_power": "900 Watts",
+ "stabilization": "3 \u2013 axis body stabilised using high torque reaction wheels, magnetic torquers and hydrogen thrusters",
+ "payloads": "Panchromatic Camera",
+ "launch_date": "28 April 2008",
+ "launch_site": "SHAR Centre Sriharikota India",
+ "launch_vehicle": "PSLV- C9",
+ "orbit": "635 km, Polar Sun Synchronous",
+ "inclination": "97.94 deg",
+ "mission_life": "5 years"
+ },
+ {
+ "name": "\n\n IMS-1\n \n",
+ "id": 41,
+ "orbit": "Polar Sun Synchronous",
+ "altitude": "635 km",
+ "mission_life": "2 years",
+ "physical_dimensions": "0.604x0.980x1.129 m",
+ "mass": "83 kg",
+ "power": "Two deployable sun pointing solar panels generating 220 W power, 105 Ah Lithium ion battery",
+ "telemetry,_tracking_and_command": "S-band",
+ "attitude_and_orbit_control_system": "Star Sensor, Miniature Sun Sensors, Magnetometers Gyros, Miniature Micro Reaction Wheels, Magnetic Torquers, single 1 N Hydrazine Thruster",
+ "data_handling": "S-band",
+ "data_storage": "16 Gb Solid State Recorder"
+ },
+ {
+ "name": "\n\n Chandrayaan-1\n \n",
+ "id": 42,
+ "mission": "Remote Sensing, Planetary Science",
+ "weight": "1380 kg (Mass at lift off)",
+ "onboard_power": "700 Watts",
+ "stabilization": "3 - axis stabilised using reaction wheel and attitude control thrusters, sun sensors, star sensors, fibre optic gyros and accelerometers for attitude determination.",
+ "launch_date": "22 October 2008",
+ "launch_site": "SDSC, SHAR, Sriharikota",
+ "launch_vehicle": "PSLV - C11",
+ "orbit": "100 km x 100 km : Lunar Orbit",
+ "mission_life": "2 years"
+ },
+ {
+ "name": "\n\n RISAT-2\n \n",
+ "id": 43,
+ "altitude": "550 km",
+ "inclination": "41 deg",
+ "orbit_period": "90 minutes",
+ "mass": "300 kg"
+ },
+ {
+ "name": "\n\n Oceansat-2\n \n",
+ "id": 44,
+ "date": "Sept 23, 2009",
+ "launch_site": "SHAR, Sriharikota",
+ "launch_vehicle": "PSLV - C14",
+ "orbit": "Polar Sun Synchronous",
+ "altitude": "720 km",
+ "inclination": "98.28\u00b0",
+ "period": "99.31 minutes",
+ "local_time_of_eq._crossing": "12 noon \u00b1 10 minutes",
+ "repetitivity_cycle": "2 days",
+ "payloads": "OCM, SCAT and ROSA",
+ "mass_at_lift_off": "960 kg",
+ "power": "15 Sq.m Solar panels generating 1360W, Two 24 Ah Ni-Cd Batteries",
+ "mission_life": "5 years"
+ },
+ {
+ "name": "\n\n CARTOSAT-2B\n \n",
+ "id": 45,
+ "mission": "Remote Sensing",
+ "weight": "694 kg (Mass at lift off)",
+ "onboard_orbit": "930 Watts",
+ "stabilization": "3 \u2013 axis body stabilised based on inputs from star sensors and gyros using Reaction wheels, Magnetic Torquers and Hydrazine Thrusters",
+ "payloads": "Panchromatic Camera",
+ "launch_date": "July 12, 2010",
+ "launch_site": "SHAR Centre Sriharikota India",
+ "launch_vehicle": "PSLV- C15",
+ "orbit": "630 kms, Polar Sun Synchronous",
+ "inclination": "97.71\u00ba"
+ },
+ {
+ "name": "\n\n RESOURCESAT-2\n \n",
+ "id": 46,
+ "mission": "Remote Sensing",
+ "orbit": "Circular Polar Sun Synchronous",
+ "orbit_altitude_at_injection": "822 km + 20 km (3 Sigma)",
+ "orbit_inclination": "98.731\u00ba + 0.2\u00ba",
+ "lift-off_mass": "1206 kg",
+ "orbit_period": "101.35 min",
+ "number_of_orbits_per_day": "14",
+ "local_time_of_equator_crossing": "10:30 am",
+ "repetivity": "24 days",
+ "attitude_and_orbit_control": "3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters",
+ "power": "Solar Array generating 1250 W at End Of Life, two 24 AH Ni-Cd batteries",
+ "launch_date": "April 20, 2011",
+ "launch_site": "SHAR Centre Sriharikota India",
+ "launch_vehicle": "PSLV- C16",
+ "mission_life": "5 years"
+ },
+ {
+ "name": "\n\n Megha-Tropiques\n \n",
+ "id": 47,
+ "lift-off_mass": "1000 kg",
+ "orbit": "867 km with an inclination of 20 deg to the equator",
+ "thermal": "Passive system with IRS heritage",
+ "power": "1325 W (at End of Life) Two 24 AH NiCd batteries",
+ "ttc": "S-band",
+ "attitude_and_orbit_control": "3-axis stabilised with 4 Reaction Wheels, Gyros and Star sensors, Hydrazine based RCS",
+ "solid_state_recorder": "16 Gb",
+ "launch_date": "October 12, 2011",
+ "launch_site": "SDSC SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV- C18"
+ },
+ {
+ "name": "\n\n RISAT-1\n \n",
+ "id": 48,
+ "mass": "1858 kg",
+ "orbit": "Circular Polar Sun Synchronous",
+ "orbit_altitude": "536 km",
+ "orbit_inclination": "97.552 o",
+ "orbit_period": "95.49 min",
+ "number_of_orbits_per_day": "14",
+ "local_time_of_equator_crossing": "6:00 am / 6:00 pm",
+ "power": "Solar Array generating 2200 W and one 70 AH Ni-H2 battery",
+ "repetivity": "25 days",
+ "attitude_and_orbit_control": "3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters",
+ "nominal_mission_life": "5 years",
+ "launch_date": "April 26, 2012",
+ "launch_site": "SDSC SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV- C19"
+ },
+ {
+ "name": "\n\n SARAL\n \n",
+ "id": 49,
+ "lift-off_mass": "407 kg",
+ "orbit": "781 km polar Sun synchronous",
+ "sensors": "4 PI sun sensors, magnetometer, star sensors and miniaturised gyro based Inertial Reference Unit",
+ "orbit_inclination": "98.538 o",
+ "local_time_of_equator": "18:00 hours crossing",
+ "power": "Solar Array generating 906 W and 46.8 Ampere-hour Lithium-ion battery",
+ "onboard_data_storage": "32 Gb",
+ "attitude_and_orbit_control": "3-axis stabilisation with reaction wheels, Hydrazine Control System based thrusters",
+ "mission_life": "5 years",
+ "launch_date": "Feb 25, 2013",
+ "launch_site": "SDSC SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV - C20"
+ },
+ {
+ "name": "\n\n IRNSS-1A\n \n",
+ "id": 50,
+ "lift-off_mass": "1425 kg",
+ "physical_dimensions": "1.58 metre x 1.50 metre x 1.50 metre",
+ "orbit": "Geosynchronous, at 55 deg East longitude with 29 deg inclination",
+ "power": "Two solar panels generating 1660 W, one lithium-ion battery of 90 Ampere-Hour capacity",
+ "propulsion": "440 Newton Liquid Apogee Motor, twelve 22 Newton Thrusters",
+ "control_system": "Zero momentum system, orientation input from Sun & star Sensors and Gyroscopes; Reaction Wheels, Magnetic Torquers and 22 Newton thrusters as actuators",
+ "mission_life": "10 years",
+ "launch_date": "Jul 01, 2013",
+ "launch_site": "SDSC SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV - C22"
+ },
+ {
+ "name": "\n\n INSAT-3D\n \n",
+ "id": 51,
+ "mission": "Meteorological and Search & Rescue Services",
+ "mass_at_lift-off": "2060 kg",
+ "power": "Solar panel generating 1164 W Two 18 Ah Ni-Cd batteries",
+ "physical_dimensions": "2.4m x 1.6m x 1.5m",
+ "propulsion": "440 Newton Liquid Apogee Motor (LAM) and twelve 22 Newton thrusters with Mono Methyl Hydrazine (MMH) as fuel and mixed Oxides of Nitrogen (MON-3) as oxidizer",
+ "stabilisation": "3-asix body stabilized in orbit using Sun Sensors, Star Sensors, gyroscopes, Momentum and Reaction Wheels, Magnetic Torquers and thrusters",
+ "antennae": "0.9m and 1.0m body mounted antennas",
+ "launch_date": "July 26, 2013",
+ "launch_site": "Kourou, French Guiana",
+ "launch_vehicle": "Ariane-5 VA-214",
+ "orbit": "Geostationary, 82 deg E Longitude",
+ "mission_life": "7 Years"
+ },
+ {
+ "name": "\n\n IRNSS-1B\n \n",
+ "id": 52,
+ "off_mass": "1432 kg",
+ "physical_dimensions": "1.58 metre x 1.50 metre x 1.50 metre",
+ "orbit": "Geosynchronous, at 55 deg East longitude with 29 deg inclination",
+ "power": "Two solar panels generating 1660 W, one lithium-ion battery of 90 Ampere-Hour capacity",
+ "propulsion": "440 Newton Liquid Apogee Motor, twelve 22 Newton Thrusters",
+ "control_system": "Zero momentum system, orientation input from Sun & star Sensors and Gyroscopes; Reaction Wheels, Magnetic Torquers and 22 Newton thrusters as actuators",
+ "mission_life": "10 years",
+ "launch_date": "Apr 04, 2014",
+ "launch_site": "SDSC SHAR Centre, Sriharikota, India",
+ "launch_vehicle": "PSLV - C24"
+ },
+ {
+ "name": "\n\n Cartosat-3\n \n",
+ "id": 53,
+ "mean________________________________________________________________altitude": "509 km",
+ "mean_inclination": "97.5\u00b0",
+ "overall_mass": "1625 kg",
+ "power_generation": "2000W",
+ "mission_life": "5 years"
+ },
+ {
+ "name": "\n\n RISAT-2BR1\n \n",
+ "id": 54,
+ "lift-off_weight": "628 kg",
+ "altitude": "576 km",
+ "payload": "X-Band Radar",
+ "inclination": "37 deg",
+ "mission_life": "5 years"
+ }
+]
\ No newline at end of file
diff --git a/isro_scrape/scraping.ipynb b/isro_scrape/scraping.ipynb
index f82c177..2a13e2f 100644
--- a/isro_scrape/scraping.ipynb
+++ b/isro_scrape/scraping.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 221,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -14,7 +14,7 @@
},
{
"cell_type": "code",
- "execution_count": 222,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -26,17 +26,51 @@
},
{
"cell_type": "code",
- "execution_count": 223,
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Collecting lxml\n",
+ " Downloading lxml-6.0.2-cp311-cp311-win_amd64.whl.metadata (3.7 kB)\n",
+ "Downloading lxml-6.0.2-cp311-cp311-win_amd64.whl (4.0 MB)\n",
+ " ---------------------------------------- 0.0/4.0 MB ? eta -:--:--\n",
+ " ----- ---------------------------------- 0.5/4.0 MB 5.6 MB/s eta 0:00:01\n",
+ " ------------------------------------ --- 3.7/4.0 MB 12.1 MB/s eta 0:00:01\n",
+ " ---------------------------------------- 4.0/4.0 MB 11.5 MB/s eta 0:00:00\n",
+ "Installing collected packages: lxml\n",
+ "Successfully installed lxml-6.0.2\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "[notice] A new release of pip is available: 25.1.1 -> 26.0.1\n",
+ "[notice] To update, run: python.exe -m pip install --upgrade pip\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install lxml"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
- "soup = BeautifulSoup(response.text,'lxml')\n",
+ "soup = BeautifulSoup(response.text,'html.parser')\n",
"spacecrafts = soup.find_all(\"a\", {\"class\":\"out\"})\n"
]
},
{
"cell_type": "code",
- "execution_count": 232,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -45,470 +79,487 @@
"text": [
"[\n",
" {\n",
- " \"name\": \"RISAT-2BR1\",\n",
- " \"id\": 1,\n",
- " \"lift-off_weight\": \"628 kg\",\n",
- " \"altitude\": \"576 km\",\n",
- " \"payload\": \"X-Band Radar\",\n",
- " \"inclination\": \"37 deg\",\n",
- " \"mission_life\": \"5 years\"\n",
- " },\n",
- " {\n",
- " \"name\": \"Cartosat-3\",\n",
+ " \"name\": \"\\n\\n Aryabhata\\n \\n\",\n",
" \"id\": 1,\n",
- " \"mean________________________________________________________________altitude\": \"509 km\",\n",
- " \"mean_inclination\": \"97.5\\u00b0\",\n",
- " \"overall_mass\": \"1625 kg\",\n",
- " \"power_generation\": \"2000W\",\n",
- " \"mission_life\": \"5 years\"\n",
+ " \"mission\": \"Scientific/ Experimental\",\n",
+ " \"weight\": \"360 kg\",\n",
+ " \"on_board_power\": \"46 Watts\",\n",
+ " \"communication\": \"VHF band\",\n",
+ " \"stabilization\": \"Spinstabilize\",\n",
+ " \"payload\": \"X-ray Astronomy Aeronomy & Solar Physics\",\n",
+ " \"launch_date\": \"April 19, 1975\",\n",
+ " \"launch_site\": \"Volgograd Launch Station (presently in Russia)\",\n",
+ " \"launch_vehicle\": \"C-1 Intercosmos\",\n",
+ " \"orbit\": \"563 x 619 km\",\n",
+ " \"inclination\": \"50.7 deg\",\n",
+ " \"mission_life\": \"6 months(nominal), Spacecraft mainframe active till March,1981\",\n",
+ " \"orbital_life\": \"Nearly seventeen years (Re-entered on February 10,1992)\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-15\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication and Satellite Navigation\",\n",
- " \"weight\": \"3164 kg (Mass at Lift \\u2013 off) 1440 kg (Dry Mass)\",\n",
- " \"power\": \"Solar array providing 6200 Watts and Three 100 AH Lithium-Ion batteries\",\n",
- " \"propulsion\": \"Bi- propellant System\",\n",
- " \"launch____________________________________________________________date\": \"November 11, 2015\",\n",
- " \"launch____________________________________________________________site\": \"Kourou, French Guiana\",\n",
- " \"launch____________________________________________________________vehicle\": \"Ariane-5 VA-227\",\n",
- " \"orbit\": \"Geostationary (93.5\\u00b0 East longitude) Co-located with INSAT-3A and INSAT-4B\",\n",
- " \"mission____________________________________________________________life\": \"12 Years\"\n",
+ " \"name\": \"\\n\\n Bhaskara-I\\n \\n\",\n",
+ " \"id\": 2,\n",
+ " \"mission\": \"Experimental Remote Sensing\",\n",
+ " \"weight\": \"442 kg\",\n",
+ " \"onboard_power\": \"47 Watts\",\n",
+ " \"communication\": \"VHF band\",\n",
+ " \"stabilization\": \"Spin stabilized (spin axis controlled)\",\n",
+ " \"payload\": \"TVcameras, three band Microwave Radiometer (SAMIR)\",\n",
+ " \"launch_date\": \"Jun 07,1979\",\n",
+ " \"launch_site\": \"Volgograd Launch Station (presently in Russia)\",\n",
+ " \"launch_vehicle\": \"C-1Intercosmos\",\n",
+ " \"orbit\": \"519 x 541 km\",\n",
+ " \"inclination\": \"50.6 deg\",\n",
+ " \"mission_life\": \"One year (nominal)\",\n",
+ " \"orbital_life\": \"About 10 years ( Re-entered in 1989 )\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-6\",\n",
- " \"id\": 1,\n",
- " \"physical____________________________________________________________properties\": \"Lift off Mass : 2117 kg Main Structure : I-2K Overall size(m) : 2.1 x 2.5 x 4.1\",\n",
- " \"power\": \"Generated power 3100 W\",\n",
- " \"aocs\": \"Momentum biased 3-axis stabilised\",\n",
- " \"antennas\": \"One 0.8 m (fixed) and one 6 m unfurlable antenna (transmit and receive)\",\n",
- " \"communication____________________________________________________________payloads\": \"i. S-band payload with five spot beams covering India for user links ii. C-band payload with one beam covering India for hub links S-band payload uses 6 m unfurlable antenna and C-band uses 0.8 m antenna.\",\n",
- " \"mission_life\": \"9 years\"\n",
+ " \"name\": \"\\n\\n Rohini Technology Payload\\n (RTP)\\n \\n\",\n",
+ " \"id\": 3,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"35 kg\",\n",
+ " \"onboard_power\": \"3 Watts\",\n",
+ " \"communication\": \"VHF band\",\n",
+ " \"stabilization\": \"Spin stabilized (spin axis controlled)\",\n",
+ " \"payload\": \"Launch vehicle monitoring instruments\",\n",
+ " \"launch_date\": \"August 10,1979\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"SLV-3\",\n",
+ " \"orbit\": \"Not achieved\"\n",
" },\n",
" {\n",
- " \"name\": \"IRNSS-1B\",\n",
- " \"id\": 1,\n",
- " \"off_mass\": \"1432 kg\",\n",
- " \"physical_dimensions\": \"1.58 metre x 1.50 metre x 1.50 metre\",\n",
- " \"orbit\": \"Geosynchronous, at 55 deg East longitude with 29 deg inclination\",\n",
- " \"power\": \"Two solar panels generating 1660 W, one lithium-ion battery of 90 Ampere-Hour capacity\",\n",
- " \"propulsion\": \"440 Newton Liquid Apogee Motor, twelve 22 Newton Thrusters\",\n",
- " \"control_system\": \"Zero momentum system, orientation input from Sun & star Sensors and Gyroscopes; Reaction Wheels, Magnetic Torquers and 22 Newton thrusters as actuators\",\n",
- " \"mission_life\": \"10 years\",\n",
- " \"launch_date\": \"Apr 04, 2014\",\n",
- " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV - C24\"\n",
+ " \"name\": \"\\n\\n Rohini Satellite RS-1\\n \\n\",\n",
+ " \"id\": 4,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"35 kg\",\n",
+ " \"onboard_power\": \"16 Watts\",\n",
+ " \"communication\": \"VHF band\",\n",
+ " \"stabilization\": \"Spin stabilized\",\n",
+ " \"payload\": \"Launch vehicle monitoring instruments\",\n",
+ " \"launch_date\": \"July 18,1980\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"SLV-3\",\n",
+ " \"orbit\": \"305 x 919 km\",\n",
+ " \"inclination\": \"44.7 deg.\",\n",
+ " \"mission_life\": \"1.2 years\",\n",
+ " \"orbital_life\": \"20 months\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-14\",\n",
- " \"id\": 1,\n",
- " \"mass_at_lift-off\": \"1982 kg\",\n",
- " \"overall_size_(m)\": \"2.0 X 2.0 X 3.6\",\n",
- " \"power\": \"2600 W\",\n",
- " \"attitude_and_orbit_control_system_(aocs)\": \"Momentum biased 3-axis stabilized mode\",\n",
- " \"propulsion_system\": \"Bi propellant-Mono Methyl Hydrazine and Mixed Oxides of Nitrogen (MON-3)\",\n",
- " \"antennae\": \"One 2m and one 2.2 m single shell shaped reflector Antennae (transmit and receive)\",\n",
- " \"launch_date\": \"January 05, 2014\",\n",
- " \"launch_site\": \"SDSC, SHAR\",\n",
- " \"launch_vehicle\": \"GSLV-D5\",\n",
- " \"orbit\": \"74 deg East longitude in geostationary orbit\",\n",
- " \"mission_life\": \"12 Years\"\n",
+ " \"name\": \"\\n\\n Rohini Satellite RS-D1\\n \\n\",\n",
+ " \"id\": 5,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"38 kg\",\n",
+ " \"onboard_power\": \"16 Watts\",\n",
+ " \"communication\": \"VHF band\",\n",
+ " \"stabilization\": \"Spin stabilized\",\n",
+ " \"payload\": \"Landmark Tracker ( remote sensing payload)\",\n",
+ " \"launch_date\": \"May 31,1981\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"SLV-3\",\n",
+ " \"orbit\": \"186 x 418 km (achieved)\",\n",
+ " \"inclination\": \"46 deg\",\n",
+ " \"orbital_life\": \"Nine days\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-7\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"mass_at_lift-off\": \"2650 kg\",\n",
- " \"physical_dimensions\": \"3.1 m X 1.7 m X 2.0 m\",\n",
- " \"power\": \"3,000 W (end of life)\",\n",
- " \"satbilisation\": \"3-axis stabilized\",\n",
- " \"launch_date\": \"August 30, 2013\",\n",
- " \"launch_site\": \"Kourou, French Guiana\",\n",
- " \"launch_vehicle\": \"Ariane-5 VA-215\",\n",
- " \"orbit\": \"74oE Geo Stationary\",\n",
- " \"mission_life\": \"> 7 Years\"\n",
+ " \"name\": \"\\n\\n APPLE\\n \\n\",\n",
+ " \"id\": 6,\n",
+ " \"mission\": \"Experimental geostationary communication\",\n",
+ " \"weight\": \"670 kg\",\n",
+ " \"onboard_power\": \"210 Watts\",\n",
+ " \"communication\": \"VHF and C-band\",\n",
+ " \"stabilization\": \"Three axis stabilized (biased momentum) with Momentum Wheels, Torquers & \\u00a0Hydrazine based Reaction control system\",\n",
+ " \"payload\": \"C - band transponders (Two)\",\n",
+ " \"launch_date\": \"June19,1981\",\n",
+ " \"launch_site\": \"Kourou (CSG), French Guyana\",\n",
+ " \"launch_vehicle\": \"Ariane -1(V-3)\",\n",
+ " \"orbit\": \"Geosynchronous (102 deg. E\\u00a0 longitude, over Indonesia)\",\n",
+ " \"inclination\": \"Near zero\",\n",
+ " \"mission_life\": \"Two years\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-3D\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Meteorological and Search & Rescue Services\",\n",
- " \"mass_at_lift-off\": \"2060 kg\",\n",
- " \"power\": \"Solar panel generating 1164 W Two 18 Ah Ni-Cd batteries\",\n",
- " \"physical_dimensions\": \"2.4m x 1.6m x 1.5m\",\n",
- " \"propulsion\": \"440 Newton Liquid Apogee Motor (LAM) and twelve 22 Newton thrusters with Mono Methyl Hydrazine (MMH) as fuel and mixed Oxides of Nitrogen (MON-3) as oxidizer\",\n",
- " \"stabilisation\": \"3-asix body stabilized in orbit using Sun Sensors, Star Sensors, gyroscopes, Momentum and Reaction Wheels, Magnetic Torquers and thrusters\",\n",
- " \"antennae\": \"0.9m and 1.0m body mounted antennas\",\n",
- " \"launch_date\": \"July 26, 2013\",\n",
- " \"launch_site\": \"Kourou, French Guiana\",\n",
- " \"launch_vehicle\": \"Ariane-5 VA-214\",\n",
- " \"orbit\": \"Geostationary, 82 deg E Longitude\",\n",
- " \"mission_life\": \"7 Years\"\n",
+ " \"name\": \"\\n\\n Bhaskara-II\\n \\n\",\n",
+ " \"id\": 7,\n",
+ " \"mission\": \"Experimental Remote Sensing\",\n",
+ " \"weight\": \"444 kg\",\n",
+ " \"onboard_power\": \"47 Watts\",\n",
+ " \"communication\": \"VHF band\",\n",
+ " \"stabilization\": \"Spin stabilized (spin axis controlled)\",\n",
+ " \"payload\": \"TV cameras, three band Microwave Radiometer (SAMIR)\",\n",
+ " \"launch_date\": \"Nov 20, 1981\",\n",
+ " \"launch_site\": \"Volgograd Launch Station (presently in Russia)\",\n",
+ " \"launch_vehicle\": \"C-1 Intercosmos\",\n",
+ " \"orbit\": \"541 x 557 km\",\n",
+ " \"inclination\": \"50.7o\",\n",
+ " \"mission_life\": \"One year (nominal)\",\n",
+ " \"orbital_life\": \"About 10 years ( Re-entered in 1991 )\"\n",
" },\n",
" {\n",
- " \"name\": \"IRNSS-1A\",\n",
- " \"id\": 1,\n",
- " \"lift-off_mass\": \"1425 kg\",\n",
- " \"physical_dimensions\": \"1.58 metre x 1.50 metre x 1.50 metre\",\n",
- " \"orbit\": \"Geosynchronous, at 55 deg East longitude with 29 deg inclination\",\n",
- " \"power\": \"Two solar panels generating 1660 W, one lithium-ion battery of 90 Ampere-Hour capacity\",\n",
- " \"propulsion\": \"440 Newton Liquid Apogee Motor, twelve 22 Newton Thrusters\",\n",
- " \"control_system\": \"Zero momentum system, orientation input from Sun & star Sensors and Gyroscopes; Reaction Wheels, Magnetic Torquers and 22 Newton thrusters as actuators\",\n",
- " \"mission_life\": \"10 years\",\n",
- " \"launch_date\": \"Jul 01, 2013\",\n",
- " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV - C22\"\n",
+ " \"name\": \"\\n\\n Rohini Satellite RS-D2\\n \\n\",\n",
+ " \"id\": 8,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"41.5 kg\",\n",
+ " \"onboard_power\": \"16 Watts\",\n",
+ " \"communication\": \"VHF band\",\n",
+ " \"stabilization\": \"Spin stabilized\",\n",
+ " \"payload\": \"Smart sensor (remote sensing payload), L-band beacon\",\n",
+ " \"launch_date\": \"April 17, 1983\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"SLV-3\",\n",
+ " \"orbit\": \"371 x 861 km\",\n",
+ " \"inclination\": \"46o\",\n",
+ " \"mission_life\": \"17 months\",\n",
+ " \"orbital_life\": \"Seven years (Re-entered on April 19, 1990)\"\n",
" },\n",
" {\n",
- " \"name\": \"SARAL\",\n",
- " \"id\": 1,\n",
- " \"lift-off_mass\": \"407 kg\",\n",
- " \"orbit\": \"781 km polar Sun synchronous\",\n",
- " \"sensors\": \"4 PI sun sensors, magnetometer, star sensors and miniaturised gyro based Inertial Reference Unit\",\n",
- " \"orbit_inclination\": \"98.538o\",\n",
- " \"local_time_of_equator\": \"18:00 hours crossing\",\n",
- " \"power\": \"Solar Array generating 906 W and 46.8 Ampere-hour Lithium-ion battery\",\n",
- " \"onboard_data_storage\": \"32 Gb\",\n",
- " \"attitude_and_orbit_control\": \"3-axis stabilisation with reaction wheels, Hydrazine Control System based thrusters\",\n",
- " \"mission_life\": \"5 years\",\n",
- " \"launch_date\": \"Feb 25, 2013\",\n",
- " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV - C20\"\n",
+ " \"name\": \"\\n\\n SROSS-1\\n \\n\",\n",
+ " \"id\": 9,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"150 kg\",\n",
+ " \"onboard_power\": \"90 Watts\",\n",
+ " \"communication\": \"S-band and VHF\",\n",
+ " \"stabilization\": \"Three axis body stabilized (biased momentum) with a Momentum Wheel and Magnetic Torquer\",\n",
+ " \"propulsion_system\": \"Monopropellant (Hydrazine based) Reaction control system\",\n",
+ " \"payload\": \"Launch Vehicle Monitoring Platform(LVMP), Gamma Ray Burst (GRB) payload and Corner Cube Retro Reflector (CCRR) for laser tracking\",\n",
+ " \"launch_date\": \"March 24, 1987\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
+ " \"orbital_life\": \"Not realised\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-10\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"weight\": \"3400 kg (Mass at Lift \\u2013 off) 1498 kg (Dry Mass)\",\n",
- " \"power\": \"Solar array providing 6474 Watts (at Equinox) and two 128 AH Lithium-Ion batteries\",\n",
- " \"physical_dimensions\": \"2.0 m X 1.77 m X 3.1 m cuboid\",\n",
- " \"propulsion\": \"440 Newton Liquid Apogee Motors (LAM) with Mono Methyl Hydrazine (MMH) as fuel and Mixed oxides of Nitrogen (MON-3) as oxidizer for orbit raising.\",\n",
- " \"stabilisation\": \"3-axis body stabilised in orbit using Earth Sensors, Sun Sensors, Momentum and Reaction Wheels, Magnetic Torquers and eight 10 Newton and eight 22 Newton bipropellant thrusters\",\n",
- " \"antennae\": \"East : 2.2 m dia circular deployable Dual Gridded Reflector (DGR) West : 2.2 m X 2.4 m elliptical deployable DGR Earth Viewing Face (top) : 0.7 m parabolic, 0.9 m parabolic and 0.8 m X 0.8 m sixteen element helical antenna for GAGAN\",\n",
- " \"launch_date\": \"September 29, 2012\",\n",
- " \"launch_site\": \"Kourou, French Guiana\",\n",
- " \"launch_vehicle\": \"Ariane-5 VA-209\",\n",
- " \"orbit\": \"Geostationary (83\\u00b0 East longitude), co-located with INSAT-4A and GSAT-12\",\n",
- " \"mission_life\": \"15 Years\"\n",
+ " \"name\": \"\\n\\n IRS-1A\\n \\n\",\n",
+ " \"id\": 10,\n",
+ " \"mission\": \"Operational Remote Sensing\",\n",
+ " \"weight\": \"975 kg\",\n",
+ " \"onboard_power\": \"600 Watts\",\n",
+ " \"communication\": \"S-band, X-band and VHF(commanding only)\",\n",
+ " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reactions Wheels, Magnetic torquers\",\n",
+ " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 Newton thrusters\",\n",
+ " \"payload\": \"Three solid state Push Broom Cameras: LISS-1(72.5 metre resolution), LISS-2A and LISS-2B (36.25 metre resolution)\",\n",
+ " \"launch_date\": \"March 17, 1988\",\n",
+ " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
+ " \"launch_vehicle\": \"Vostok\",\n",
+ " \"orbit\": \"904 km Polar Sun-synchronous\",\n",
+ " \"inclination\": \"99.08o\",\n",
+ " \"repetivity\": \"22 days (307 orbits)\",\n",
+ " \"local_time\": \"10.30 a.m. (descending node)\",\n",
+ " \"mission_completed_during\": \"July 1996\"\n",
" },\n",
" {\n",
- " \"name\": \"RISAT-1\",\n",
- " \"id\": 1,\n",
- " \"mass\": \"1858 kg\",\n",
- " \"orbit\": \"Circular Polar Sun Synchronous\",\n",
- " \"orbit_altitude\": \"536 km\",\n",
- " \"orbit_inclination\": \"97.552o\",\n",
- " \"orbit_period\": \"95.49 min\",\n",
- " \"number_of_orbits_per_day\": \"14\",\n",
- " \"local_time_of_equator_crossing\": \"6:00 am / 6:00 pm\",\n",
- " \"power\": \"Solar Array generating 2200 W and one 70 AH Ni-H2 battery\",\n",
- " \"repetivity\": \"25 days\",\n",
- " \"attitude_and_orbit_control\": \"3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
- " \"nominal_mission_life\": \"5 years\",\n",
- " \"launch_date\": \"April 26, 2012\",\n",
- " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV- C19\"\n",
+ " \"name\": \"\\n\\n SROSS-2\\n \\n\",\n",
+ " \"id\": 11,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"150 kg\",\n",
+ " \"onboard_power\": \"90 Watts\",\n",
+ " \"communication\": \"S-band and VHF\",\n",
+ " \"stabilization\": \"Three axis body stabilized (biased momentum) with a Momentum Wheel and Magnetic Torquer\",\n",
+ " \"propulsion_system\": \"Monopropellant (Hydrazine based) Reaction Control System\",\n",
+ " \"payload\": \"Gamma Ray Burst (GRB) payload and Mono Payload Ocular Electro-Optic Stereo Scanner (MEOSS) built by DLR, Germany\",\n",
+ " \"launch_date\": \"July 13, 1988\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
+ " \"orbit\": \"Not realised\"\n",
" },\n",
" {\n",
- " \"name\": \"Megha-Tropiques\",\n",
- " \"id\": 1,\n",
- " \"lift-off_mass\": \"1000 kg\",\n",
- " \"orbit\": \"867 km with an inclination of 20 deg to the equator\",\n",
- " \"thermal\": \"Passive system with IRS heritage\",\n",
- " \"power\": \"1325 W (at End of Life) Two 24 AH NiCd batteries\",\n",
- " \"ttc\": \"S-band\",\n",
- " \"attitude_and_orbit_control\": \"3-axis stabilised with 4 Reaction Wheels, Gyros and Star sensors, Hydrazine based RCS\",\n",
- " \"solid_state_recorder\": \"16 Gb\",\n",
- " \"launch_date\": \"October 12, 2011\",\n",
- " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV- C18\"\n",
+ " \"name\": \"\\n\\n IRS-1B\\n \\n\",\n",
+ " \"id\": 12,\n",
+ " \"mission\": \"Operational Remote Sensing\",\n",
+ " \"weight\": \"975 kg\",\n",
+ " \"onboard_power\": \"600 Watts\",\n",
+ " \"communication\": \"S-band, X-band and VHF (commanding only)\",\n",
+ " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reactions Wheels, Magnetic torquers\",\n",
+ " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 Newton thrusters\",\n",
+ " \"payload\": \"Three solid state Push Broom Cameras LlSS-1 (72.5 metre resolution), LlSS-2A and LlSS-2B (36.25 metre resolution)\",\n",
+ " \"launch_date\": \"August 29, 1991\",\n",
+ " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
+ " \"launch_vehicle\": \"Vostok\",\n",
+ " \"orbit\": \"904 km Polar Sun Synchronous\",\n",
+ " \"inclination\": \"99.08o\",\n",
+ " \"repetivity\": \"22 days\",\n",
+ " \"local_time\": \"10.30 a.m. (descending node)\",\n",
+ " \"mission_completed_on\": \"December 20, 2003\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-12\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"weight\": \"1410 kg (Mass at Lift \\u2013 off) 559 kg (Dry Mass)\",\n",
- " \"power\": \"Solar array providing 1430 Watts and one 64 Ah Li-Ion batteries\",\n",
- " \"physical_dimensions\": \"1.485 x 1.480 x 1.446 m cuboid\",\n",
- " \"propulsion\": \"440 Newton Liquid Apogee Motors (LAM) with Mono Methyl Hydrazine (MMH) as fuel and Mixed oxides of Nitrogen (MON-3) as oxidizer for orbit raising.\",\n",
- " \"attitude_orbit_control\": \"3-axis body stabilised in orbit using Earth Sensors, Sun Sensors, Momentum and Reaction Wheels, Magnetic Torquers and eight 10 Newton and eight 22 Newton bipropellant thrusters\",\n",
- " \"antennae\": \"One 0.7 m diameter body mounted parabolic receive antenna and one 1.2 m diameter polarisation sensitive deployable antenna\",\n",
- " \"launch_date\": \"July 15, 2011\",\n",
- " \"launch_site\": \"SHAR, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV-C17\",\n",
- " \"orbit\": \"Geosynchronous (83\\u00b0 longitude)\",\n",
- " \"mission_life\": \"About 8 Years\"\n",
+ " \"name\": \"\\n\\n SROSS-C\\n \\n\",\n",
+ " \"id\": 13,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"106.1 kg\",\n",
+ " \"onboard_power\": \"45 Watts\",\n",
+ " \"communication\": \"S-band and VHF\",\n",
+ " \"stabilization\": \"Spin stabilized with a Magnetic Torquer and Magnetic Bias Control\",\n",
+ " \"payload\": \"Gamma Ray Burst (GRB) experiment & Retarding Potential Analyser (RPA) experiment\",\n",
+ " \"launch_date\": \"May 20,1992\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
+ " \"orbit\": \"267 x 391 km\",\n",
+ " \"mission_life\": \"Two months (Re-entered on July15,1992)\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-8\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"weight\": \"3093 kg (Mass at Lift \\u2013 off) 1426 kg (Dry Mass)\",\n",
- " \"power\": \"Solar array providing 6242 watts three 100 Ah Lithium Ion batteries\",\n",
- " \"physical_dimensions\": \"2.0 x 1.77 x 3.1m cuboid\",\n",
- " \"propulsion\": \"440 Newton Liquid Apogee Motors (LAM) with mono Methyl Hydrazine (MMH) as fuel and Mixed oxides of Nitrogen (MON-3) as oxidizer for orbit raising.\",\n",
- " \"stabilisation\": \"3-axis body stabilised in orbit using Earth Sensors, Sun Sensors, Momentum and Reaction Wheels, Magnetic Torquers and eight 10 Newton and eight 22 Newton bipropellant thrusters\",\n",
- " \"antennas\": \"Two indigenously developed 2.2 m diameter transmit/receive polarisation sensitive dual grid shaped beam deployable reflectors with offset-fed feeds illumination for Ku-band; 0.6 m C-band and 0.8x0.8 sq m L-band helix antenna for GAGAN\",\n",
- " \"launch_date\": \"May 21, 2011\",\n",
- " \"launch_site\": \"Kourou, French Guiana\",\n",
- " \"launch_vehicle\": \"Ariane-5 VA-202\",\n",
- " \"orbit\": \"Geosynchronous (55\\u00b0 E)\",\n",
- " \"mission_life\": \"More Than 12 Years\"\n",
+ " \"name\": \"\\n\\n INSAT-2A\\n \\n\",\n",
+ " \"id\": 14,\n",
+ " \"mission\": \"Multipurpose Communication, meteorology and Satellite based search and rescue\",\n",
+ " \"weight\": \"1906 kg with propellant 916 kg dry weight\",\n",
+ " \"onboard_power\": \"One KW approx\",\n",
+ " \"communication\": \"C, extended C and S band\",\n",
+ " \"stabilization\": \"Three axis body stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
+ " \"propulsion\": \"Integrated bipropellant system (MMH and N2 04) With sixteen 22 N thrusters and 440 LAM.\",\n",
+ " \"payload\": \"Transponders: 12 C-band (for FSS),6 ext. C-band (for FSS) 2 S-band (for BSS),1Data relay transponder (for met.data), 1 transponder for research and rescue, Very High Resolution radiometer (VHRR) for\\u00a0meteorological observation with 2 km resolution in the visible and 8 km resolution in the IR band\",\n",
+ " \"launch_date\": \"July 10,1992\",\n",
+ " \"launch_site\": \"French Guyana\",\n",
+ " \"launch_vehicle\": \"Ariane 4\",\n",
+ " \"orbit\": \"Geostationary 74oE longitude\",\n",
+ " \"inclination\": \"0o\",\n",
+ " \"mission_life\": \"Seven years(nominal)\",\n",
+ " \"orbit_life\": \"Very Long\"\n",
" },\n",
" {\n",
- " \"name\": \"RESOURCESAT-2\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Remote Sensing\",\n",
- " \"orbit\": \"Circular Polar Sun Synchronous\",\n",
- " \"orbit_altitude_at_injection\": \"822 km + 20 km (3 Sigma)\",\n",
- " \"orbit_inclination\": \"98.731\\u00ba + 0.2\\u00ba\",\n",
- " \"lift-off_mass\": \"1206 kg\",\n",
- " \"orbit_period\": \"101.35 min\",\n",
- " \"number_of_orbits_per_day\": \"14\",\n",
- " \"local_time_of_equator_crossing\": \"10:30 am\",\n",
- " \"repetivity\": \"24 days\",\n",
- " \"attitude_and_orbit_control\": \"3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
- " \"power\": \"Solar Array generating 1250 W at End Of Life, two 24 AH Ni-Cd batteries\",\n",
- " \"launch_date\": \"April 20, 2011\",\n",
- " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C16\",\n",
- " \"mission_life\": \"5 years\"\n",
+ " \"name\": \"\\n\\n INSAT-2B\\n \\n\",\n",
+ " \"id\": 15,\n",
+ " \"mission\": \"Multipurpose Communication, meteorology and Satellite based search and rescue\",\n",
+ " \"weight\": \"1906 kg with propellant 916 kg dry weight\",\n",
+ " \"onboard_power\": \"One KW approx.\",\n",
+ " \"communication\": \"C, extended C and S band\",\n",
+ " \"stabilization\": \"Three axis body stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
+ " \"propulsion\": \"Integrated bipropellant system ( MMH and N2 04) With sixteen 22 N thrusters and 440 N LAM.\",\n",
+ " \"payload\": \"Transponders: 12C-band (for FSS),6 ext. C-band (for FSS) 2S-band (for BSS),1Data relay transponder (for met.data), 1 transponder for research and rescue, Very High Resolution radiometer (VHRR) for meteorological observation with 2 km resolution in the visible and 8 km resolution in the IR band\",\n",
+ " \"launch_date\": \"July 23, 1993\",\n",
+ " \"launch_site\": \"French Guyana\",\n",
+ " \"launch_vehicle\": \"Ariane 4\",\n",
+ " \"orbit\": \"Geostationary 93.5o E\",\n",
+ " \"inclination\": \"0o\",\n",
+ " \"mission_life\": \"Seven years(nominal)\",\n",
+ " \"orbit_life\": \"Very Long\"\n",
" },\n",
" {\n",
- " \"name\": \"YOUTHSAT\",\n",
- " \"id\": 1,\n",
- " \"lift-off_mass\": \"92 kg\",\n",
- " \"orbit_period\": \"101.35 min\",\n",
- " \"dimension\": \"1020 (Pitch) x 604 (Roll) x 1340 (Yaw) mm3\",\n",
- " \"attitude_and_orbit_control\": \"3-axis body stabilised using Sun and Star Sensors, Miniature Magnetometer, Miniature Gyros, Micro Reaction Wheels and Magnetic Torquers\",\n",
- " \"power\": \"Solar Array generating 230 W, one 10.5 AH Li-ion battery\",\n",
- " \"mechanisms\": \"Paraffin Actuator based Solar Panel Hold Down and Release Mechanism\",\n",
- " \"launch_date\": \"April 20, 2011\",\n",
- " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C16\",\n",
- " \"orbit\": \"Circular Polar Sun Synchronous\",\n",
- " \"orbit_altitude_at_injection\": \"822 km\\u00a0+\\u00a020 km (3 Sigma)\",\n",
- " \"orbit_inclination\": \"98.731 \\u00ba\\u00a0+\\u00a00.2 \\u00ba\",\n",
- " \"mission_life\": \"2 years\"\n",
+ " \"name\": \"\\n\\n IRS-1E\\n \\n\",\n",
+ " \"id\": 16,\n",
+ " \"mission\": \"Operational Remote Sensing\",\n",
+ " \"weight\": \"846 kg\",\n",
+ " \"onboard_power\": \"415 Watts\",\n",
+ " \"communication\": \"S-band (TIC) & VHF\",\n",
+ " \"stabilization\": \"Three axis body stabilized ( zero momentum) with 4 Reaction Wheels, Magnetic torquers\",\n",
+ " \"rcs\": \"Monopropellant Hydrazine based RCS with 1 Newton thrusters ( 16 Nos.)\",\n",
+ " \"payload\": \"LlSS-1 MEOSS (Mono-ocula Erlectro Optic Stereo Scanner)\",\n",
+ " \"launch_date\": \"September 20, 1993\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV-D1\",\n",
+ " \"orbit\": \"Not realised\"\n",
" },\n",
" {\n",
- " \"name\": \"CARTOSAT-2B\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Remote Sensing\",\n",
- " \"weight\": \"694 kg (Mass at lift off)\",\n",
- " \"onboard_orbit\": \"930 Watts\",\n",
- " \"stabilization\": \"3 \\u2013 axis body stabilised based on inputs from star sensors and gyros using Reaction wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
- " \"payloads\": \"Panchromatic Camera\",\n",
- " \"launch_date\": \"July 12, 2010\",\n",
- " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C15\",\n",
- " \"orbit\": \"630 kms, Polar Sun Synchronous\",\n",
- " \"inclination\": \"97.71\\u00ba\"\n",
+ " \"name\": \"\\n\\n SROSS-C2\\n \\n\",\n",
+ " \"id\": 17,\n",
+ " \"mission\": \"Experimental\",\n",
+ " \"weight\": \"115 kg\",\n",
+ " \"onboard_power\": \"45 Watts\",\n",
+ " \"communication\": \"S-band and VHF\",\n",
+ " \"rcs\": \"Monopropellant Hydrazine based with six 1 Newton thrusters\",\n",
+ " \"payload\": \"Gamma Ray Burst (GRB) & Retarding Potential Analyser (RPA)\",\n",
+ " \"launch_date\": \"May 04,1994\",\n",
+ " \"launch_site\": \"SHAR Centre,Sriharikota,India\",\n",
+ " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
+ " \"orbit\": \"430 x 600 km.\",\n",
+ " \"inclination\": \"45 deg.\",\n",
+ " \"mission_life\": \"Six months (nominal)\",\n",
+ " \"orbital_life\": \"Two years (nominal)\"\n",
" },\n",
" {\n",
- " \"name\": \"Oceansat-2\",\n",
- " \"id\": 1,\n",
- " \"date\": \"Sept 23, 2009\",\n",
- " \"launch_site\": \"SHAR, Sriharikota\",\n",
- " \"launch_vehicle\": \"PSLV - C14\",\n",
- " \"orbit\": \"Polar Sun Synchronous\",\n",
- " \"altitude\": \"720 km\",\n",
- " \"inclination\": \"98.28\\u00b0\",\n",
- " \"period\": \"99.31 minutes\",\n",
- " \"local_time_of_eq._crossing\": \"12 noon \\u00b1 10 minutes\",\n",
- " \"repetitivity_cycle\": \"2 days\",\n",
- " \"payloads\": \"OCM, SCAT and ROSA\",\n",
- " \"mass_at_lift_off\": \"960 kg\",\n",
- " \"power\": \"15 Sq.m Solar panels generating 1360W, Two 24 Ah Ni-Cd Batteries\",\n",
- " \"mission_life\": \"5 years\"\n",
+ " \"name\": \"\\n\\n IRS-P2\\n \\n\",\n",
+ " \"id\": 18,\n",
+ " \"mission\": \"Operational Remote Sensing\",\n",
+ " \"weight\": \"804 kg\",\n",
+ " \"onboard_power\": \"510 Watts\",\n",
+ " \"communication\": \"S-band, X-band\",\n",
+ " \"stabilization\": \"Three axis body stabilized with 4 Reaction Wheels, Magnetic torquers\",\n",
+ " \"rcs\": \"4 tanks containing Monopropellant Hydrazine based with sixteen 1 N thrusters and one 11 N thruster\",\n",
+ " \"payload\": \"Two solid state Push Broom Cameras operating in four spectral bands in the visible and near-IR range using CCD arrays: LlSS-2A & LlSS-2B (Resolution: 32.74 metre)\",\n",
+ " \"launch_date\": \"October 15, 1994\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV-D2\",\n",
+ " \"inclination\": \"98.68 o\",\n",
+ " \"repetivity\": \"24 days\",\n",
+ " \"mission_completed_on\": \"1997\"\n",
" },\n",
" {\n",
- " \"name\": \"RISAT-2\",\n",
- " \"id\": 1,\n",
- " \"altitude\": \"550 km\",\n",
- " \"inclination\": \"41 deg\",\n",
- " \"orbit_period\": \"90 minutes\",\n",
- " \"mass\": \"300 kg\"\n",
+ " \"name\": \"\\n\\n INSAT-2C\\n \\n\",\n",
+ " \"id\": 19,\n",
+ " \"mission\": \"Communication\",\n",
+ " \"weight\": \"2106 kg with propellants 946 kg dry weight\",\n",
+ " \"onboard_power\": \"1320 Watts\",\n",
+ " \"communication\": \"C extended C, S and Ku bands\",\n",
+ " \"stabilization\": \"Three axis stabilized with two Momen'tum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
+ " \"propulsion\": \"Integrated bipropellant system ( MMH and N2 04) With sixteen 22N thrusters and 440N LAM.\",\n",
+ " \"payload\": \"Transponders: 16C-band / extended C-band transponders (for FSS), 2 high power C-band transponders (for BSS), 1S-band transponder (for BSS),1C/S-band mobile communication transponder, 3 Ku-band transponders\",\n",
+ " \"launch_date\": \"December 7, 1995\",\n",
+ " \"launch_site\": \"French Guyana\",\n",
+ " \"launch_vehicle\": \"Ariane4\",\n",
+ " \"orbit\": \"Geostationary 93.5 deg E\",\n",
+ " \"inclination\": \"0 deg.\",\n",
+ " \"mission_life\": \"Seven years(nominal)\",\n",
+ " \"orbit_life\": \"Very Long\"\n",
" },\n",
" {\n",
- " \"name\": \"Chandrayaan-1 \",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Remote Sensing, Planetary Science\",\n",
- " \"weight\": \"1380 kg (Mass at lift off)\",\n",
- " \"onboard_power\": \"700 Watts\",\n",
- " \"stabilization\": \"3 - axis stabilised using reaction wheel and attitude control thrusters, sun sensors, star sensors, fibre optic gyros and accelerometers for attitude determination.\",\n",
- " \"launch_date\": \"22 October 2008\",\n",
- " \"launch_site\": \"SDSC, SHAR, Sriharikota\",\n",
- " \"launch_vehicle\": \"PSLV - C11\",\n",
- " \"orbit\": \"100 km x 100 km : Lunar Orbit\",\n",
- " \"mission_life\": \"2 years\"\n",
+ " \"name\": \"\\n\\n IRS-1C\\n \\n\",\n",
+ " \"id\": 20,\n",
+ " \"mission\": \"Operational Remote Sensing\",\n",
+ " \"weight\": \"1250 kg\",\n",
+ " \"onboard_power\": \"809 Watts (generated by 9.6 sq.metres Solar Panels)\",\n",
+ " \"communication\": \"S-band, X-band\",\n",
+ " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reaction Wheels, Magnetic torquer\",\n",
+ " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 N thrusters & one 11N thrusters\",\n",
+ " \"payload\": \"Three solid state Push Broom Cameras: PAN (<6 metre solution )LlSS-3(23.6 metre resolution) and WiFS (189 metre resolution)\",\n",
+ " \"onboard_tape_recorder\": \"Storage Capacity : 62 G bits\",\n",
+ " \"launch_date\": \"December 28, 1995\",\n",
+ " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
+ " \"launch_vehicle\": \"Molniya\",\n",
+ " \"orbit\": \"817 km Polar Sun-synchronous\",\n",
+ " \"inclination\": \"98.69o\",\n",
+ " \"repetivity\": \"24 days\",\n",
+ " \"local_time\": \"10.30 a.m\",\n",
+ " \"mission_completed_on\": \"September 21, 2007\"\n",
" },\n",
" {\n",
- " \"name\": \"IMS-1\",\n",
- " \"id\": 1,\n",
- " \"orbit\": \"Polar Sun Synchronous\",\n",
- " \"altitude\": \"635 km\",\n",
- " \"mission_life\": \"2 years\",\n",
- " \"physical_dimensions\": \"0.604x0.980x1.129 m\",\n",
- " \"mass\": \"83 kg\",\n",
- " \"power\": \"Two deployable sun pointing solar panels generating 220 W power, 105 Ah Lithium ion battery\",\n",
- " \"telemetry,_tracking_and_command\": \"S-band\",\n",
- " \"attitude_and_orbit_control_system\": \"Star Sensor, Miniature Sun Sensors, Magnetometers Gyros, Miniature Micro Reaction Wheels, Magnetic Torquers, single 1 N Hydrazine Thruster\",\n",
- " \"data_handling\": \"S-band\",\n",
- " \"data_storage\": \"16 Gb Solid State Recorder\"\n",
+ " \"name\": \"\\n\\n IRS-P3\\n \\n\",\n",
+ " \"id\": 21,\n",
+ " \"mission\": \"Remote sensing of earth's natural resources. Study of X-ray Astronomy. Periodic calibration of PSLV tracking radar located at tracking stations.\",\n",
+ " \"weight\": \"920 kg\",\n",
+ " \"onboard_power\": \"817 Watts\",\n",
+ " \"communication\": \"S-band\",\n",
+ " \"stabilization\": \"Three axis body stabilized\",\n",
+ " \"rcs\": \"Combinations of bladder type and surface tension type mass expulsion monopropellant hydrazine system\",\n",
+ " \"payload\": \"WideField Sensor (WiFS), Modular Opto - electronic Scanner (MOS), Indian X-ray Astronomy Experiment (IXAE), C-band transponder(CBT)\",\n",
+ " \"launch_date\": \"March 21, 1996\",\n",
+ " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV-D3\",\n",
+ " \"orbit\": \"817 km. Circular polar sun-synchronous with equatorial crossing at 10.30 am (descending node)\",\n",
+ " \"inclination\": \"98.68o\",\n",
+ " \"repetivity\": \"WiFS : 5 days\",\n",
+ " \"mission_completed_during\": \"January 2006\"\n",
" },\n",
" {\n",
- " \"name\": \"CARTOSAT \\u2013\\n 2A\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Remote Sensing\",\n",
- " \"weight\": \"690 Kg (Mass at lift off)\",\n",
- " \"onboard_power\": \"900 Watts\",\n",
- " \"stabilization\": \"3 \\u2013 axis body stabilised using high torque reaction wheels, magnetic torquers and hydrogen thrusters\",\n",
- " \"payloads\": \"Panchromatic Camera\",\n",
- " \"launch_date\": \"28 April 2008\",\n",
- " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C9\",\n",
- " \"orbit\": \"635 km, Polar Sun Synchronous\",\n",
- " \"inclination\": \"97.94 deg\",\n",
- " \"mission_life\": \"5 years\"\n",
+ " \"name\": \"\\n\\n INSAT-2D\\n \\n\",\n",
+ " \"id\": 22,\n",
+ " \"mission\": \"Communication\",\n",
+ " \"weight\": \"2079 kg with propellants, 995 kg dry weight\",\n",
+ " \"onboard_power\": \"1650 Watts\",\n",
+ " \"communication\": \"C, extended C, S and Ku bands\",\n",
+ " \"stabilization\": \"Three axis stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
+ " \"propulsion\": \"Integrated bipropellan stystem ( MMH and N2 04) With sixteen 22N thrusters and 440N LAM.\",\n",
+ " \"payload\": \"Transponders: 16C-band / extended C-band transponders (forFSS), 2 high power C-band transponders (for BSS), 1S-band transponder (for BSS),1C/S-band mobile communication transponder, 3 Ku-band transponders\",\n",
+ " \"launch_date\": \"June 4, 1997\",\n",
+ " \"launch_site\": \"French Guyana\",\n",
+ " \"launch_vehicle\": \"Arianev 4\",\n",
+ " \"orbit\": \"Geostationary 93,.5deg.E\",\n",
+ " \"inclination\": \"0 deg.\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-4CR\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"weight\": \"2,130 kg (Mass at Lift \\u2013 off)\",\n",
- " \"onboard_power\": \"3000 W\",\n",
- " \"communication_payload\": \"12 Ku-band transponders employing 140 W Traveling Wave Tube Amplifiers (TWTA) Ku-band Beacon\",\n",
- " \"launch_date\": \"September 2, 2007\",\n",
- " \"launch_site\": \"SHAR, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"GSLV-F04\",\n",
- " \"orbit\": \"Geosynchronous (74\\u00b0 E)\",\n",
- " \"mission_life\": \"12 Years\"\n",
+ " \"name\": \"\\n\\n IRS-1D\\n \\n\",\n",
+ " \"id\": 23,\n",
+ " \"mission\": \"Operational Remote Sensing\",\n",
+ " \"weight\": \"1250 kg\",\n",
+ " \"onboard_power\": \"809 Watts (generated by 9.6 sq.metres Solar Panels)\",\n",
+ " \"communication\": \"S-band, X-band\",\n",
+ " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reaction Wheels, Magnetic torquer\",\n",
+ " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 N thrusters & one 11N thrusters\",\n",
+ " \"payload\": \"Three solid state Push Broom Cameras: PAN (<6 metre solution )LlSS-3(23.6 metre resolution) and WiFS (189 metre resolution)\",\n",
+ " \"onboard_tape_recorder\": \"Storage Capacity : 62 G bits\",\n",
+ " \"launch_date\": \"December 28, 1995\",\n",
+ " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
+ " \"launch_vehicle\": \"Molniya\",\n",
+ " \"orbit\": \"817 km Polar Sun-synchronous\",\n",
+ " \"inclination\": \"98.69 o\",\n",
+ " \"repetivity\": \"24 days\",\n",
+ " \"local_time\": \"10.30 a.m\",\n",
+ " \"mission_completed_on\": \"September 21, 2007\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-4B\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"weight\": \"3025 kg (at Lift \\u2013 off)\",\n",
- " \"onboard_power\": \"5859 W\",\n",
- " \"stabilization\": \"It uses 3 earth sensors, 2 digital sun sensors, 8 coarse analog sun sensors, 3 solar panel sun sensors and one sensor processing electronics. The wheels and wheel drive electronics were imported with indigenous wheel interface module to interface the wheel drive electronics and AOCE.\",\n",
- " \"propulsion\": \"The propulsion system is employing 16 thrusters, 4 each located on east, west and AY sides and 2 each on north and south sides. There is one 440 N liquid apogee motor (using Mono Methyl Hydrazine (MMH) as fuel and oxides of Nitrogen (MON3 as oxidizer) and three pressurant tanks mounted on the LAM deck.\",\n",
- " \"payload\": \"12 Ku band high power transponders covering Indian main land using 140W radiatively cooled TWTAs.\",\n",
- " \"launch_date\": \"March 12, 2007\",\n",
- " \"launch_site\": \"French Guiana\",\n",
- " \"launch_vehicle\": \"Ariane5\",\n",
- " \"orbit\": \"Geostationary (93.5o E Longitude)\",\n",
- " \"mission_life\": \"12 Years\"\n",
+ " \"name\": \"\\n\\n INSAT-2E\\n \\n\",\n",
+ " \"id\": 24,\n",
+ " \"mission\": \"Communication and Meteorology\",\n",
+ " \"spacecraft_mass\": \"2,550 kg (Mass at Lift-off) 1150 kg (Dry mass)\",\n",
+ " \"launch_date\": \"03 April 1999\",\n",
+ " \"launch_site\": \"French Guyana\",\n",
+ " \"launch_vehicle\": \"Ariane \\u2013 42P\",\n",
+ " \"orbit\": \"Geosynchronous (83 deg east longitude)\"\n",
" },\n",
" {\n",
- " \"name\": \"CARTOSAT-2\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Remote Sensing\",\n",
- " \"weight\": \"650 Kg\",\n",
- " \"onboard_orbit\": \"900 Watts\",\n",
- " \"stabilization\": \"3 - axis body stabilised using high torque reaction wheels, magnetic torquers and thrusters\",\n",
- " \"payloads\": \"Panchromatic Camera\",\n",
- " \"launch_date\": \"10 January 2007\",\n",
- " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C7\",\n",
+ " \"name\": \"\\n\\n Oceansat(IRS-P4)\\n \\n\",\n",
+ " \"id\": 25,\n",
+ " \"launch_date\": \"May 26, 1999\",\n",
+ " \"launch_site\": \"SHAR, Sriharikota\",\n",
+ " \"launch_vehicle\": \"PSLV - C2\",\n",
" \"orbit\": \"Polar Sun Synchronous\",\n",
- " \"mission_life\": \"5 years\"\n",
+ " \"altitude\": \"720 km\",\n",
+ " \"inclination\": \"98.28 deg\",\n",
+ " \"period\": \"99.31 min\",\n",
+ " \"local_time_of_eq._crossing\": \"12 noon\",\n",
+ " \"repetitivity_cycle\": \"2 days\",\n",
+ " \"size\": \"2.8m x 1.98m x 2.57m\",\n",
+ " \"mass_at_lift_off\": \"1050 kg\",\n",
+ " \"length_when_fully_deployed\": \"11.67 m\",\n",
+ " \"attitude_and_orbit_control\": \"3-axis body-stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
+ " \"power\": \"9.6 Sq.m Solar Array generating 750w Two 21 Ah Ni-Cd Batteries\",\n",
+ " \"mission_completed_on\": \"August 8, 2010\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-4A\",\n",
- " \"id\": 1,\n",
- " \"spacecraft_mass\": \"Lift off 3081 Kg Dry Mass 1386.55 Kg\",\n",
- " \"orbit\": \"Geostationary ( 83o E)\",\n",
- " \"power\": \"Solar Array to provide a power of 5922 W\",\n",
- " \"battery\": \"Three 70 Ah Ni H2 Batteries for eclipse support of 4264 W\",\n",
- " \"life\": \"12 Years\",\n",
- " \"launch_date\": \"December 22, 2005\",\n",
- " \"launch_vehicle\": \"ARIANE5-V169\"\n",
+ " \"name\": \"\\n\\n INSAT-3B\\n \\n\",\n",
+ " \"id\": 26,\n",
+ " \"mission\": \"Very long\",\n",
+ " \"spacecraft_mass\": \"2,070 (Mass at Lift \\u2013 off) 970 kg (Dry mass)\",\n",
+ " \"onboard_power\": \"1,712 W\",\n",
+ " \"stabilization\": \"3 \\u2013 axis body stabilised biased momentum control system using earth sensors, sun sensors, inertial reference unit, momentum / reaction wheels, magnetic torquers and unified bi-propellant thrusters.\",\n",
+ " \"propulsion\": \"Liquid Apogee Motor with fuel and oxidizer stored in separate titanium tanks and pressurant in Kevlar wound titanium tank.\",\n",
+ " \"payload\": \"12 extended C \\u2013 band Transponders Five Ku band Transponders Mobile Satellite Services (MSS)\",\n",
+ " \"launch_date\": \"22nd March 2000\",\n",
+ " \"launch_site\": \"French Guyana\",\n",
+ " \"launch_vehicle\": \"Ariane -5\",\n",
+ " \"orbit\": \"Geostationary (83 deg East longitude)\",\n",
+ " \"inclination\": \"7 deg\"\n",
" },\n",
" {\n",
- " \"name\": \"CARTOSAT-1\",\n",
- " \"id\": 1,\n",
- " \"launch_date\": \"5 May 2005\",\n",
+ " \"name\": \"\\n PSLV-C3 / TES\\n \",\n",
+ " \"id\": 27,\n",
+ " \"launch_date\": \"22 October 2001\",\n",
" \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C6\",\n",
- " \"orbit\": \"618 km Polar Sun Synchronous\",\n",
- " \"payloads\": \"PAN FORE, PAN - AFT\",\n",
- " \"orbit_period\": \"97 min\",\n",
- " \"number_of_orbits_per_day\": \"14\",\n",
- " \"local_time_of_equator_crossing\": \"10:30 am\",\n",
- " \"repetivity\": \"126 days\",\n",
- " \"revisit\": \"5 days\",\n",
- " \"lift-off_mass\": \"1560 kg\",\n",
- " \"attitude_and_orbit_control\": \"3-axis body stabillised using reaction wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
- " \"electrical_power\": \"15 sqm Solar Array generating 1100w, Two 24 Ah Ni-Cd batteries\",\n",
- " \"mission_life\": \"5 years\"\n",
- " },\n",
- " {\n",
- " \"name\": \"HAMSAT\",\n",
- " \"id\": 1,\n",
- " \"launch_date\": \"May 5, 2005\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV-C6\",\n",
- " \"orbit\": \"Geo-synchronous, 633.355 km (average)\",\n",
- " \"payloads\": \"2 Transponders\"\n",
- " },\n",
- " {\n",
- " \"name\": \"EDUSAT\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Education\",\n",
- " \"spacecraft_mass\": \"1950.5 kg mass (at Lift - off) 819.4 kg (Dry mass)\",\n",
- " \"onboard_power\": \"Total four solar panel of size 2.54 M x 1.525 M generating 2040 W (EOL), two 24 AH NiCd batteries for eclipse support\",\n",
- " \"stabilization\": \"3 axis body stabilised in orbit using sensors, momentum and reaction wheels, magnetic torquers and eight 10 N & 22N reaction control thrusters.\",\n",
- " \"propulsion\": \"440 N Liquid Apogee Motor with MON - 3 and MMH for orbit raising\",\n",
- " \"payload\": \"Six upper extended C - band transponders Five lower Ku band transponders with regional beam coverage One lower Ku band National beam transponder with Indian main land coverage Ku beacon 12 C band high power transponders with extended coverage, covering southeast and northwest region apart from Indian main land using 63 W LTWTAs\",\n",
- " \"launch_date\": \"September 20, 2004\",\n",
- " \"launch_site\": \"SHAR, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"GSLV-F01\",\n",
- " \"orbit\": \"Geostationary (74oE longitude)\",\n",
- " \"mission_life\": \"7 Years (minimum)\"\n",
+ " \"launch_vehicle\": \"PSLV- C3\",\n",
+ " \"orbit\": \"572 km Sun Synchronous\",\n",
+ " \"payloads\": \"PAN\"\n",
" },\n",
" {\n",
- " \"name\": \"IRS-P6 / RESOURCESAT-1\",\n",
- " \"id\": 1,\n",
- " \"launch_date\": \"October 17, 2003\",\n",
- " \"launch_site\": \"SHAR, Sriharikota\",\n",
- " \"launch_vehicle\": \"PSLV-C5\",\n",
- " \"payloads\": \"LISS-4, LISS-3, AWiFS-A, AWiFS-B\",\n",
- " \"orbit\": \"Polar Sun Synchronous\",\n",
- " \"orbit_height\": \"817 km\",\n",
- " \"orbit_inclination\": \"98.7o\",\n",
- " \"orbit_period\": \"101.35 min\",\n",
- " \"number_of_orbits_per_day\": \"14\",\n",
- " \"local_time_of_equator_crossing\": \"10:30 am\",\n",
- " \"repetivity_(liss-3)\": \"24 days\",\n",
- " \"revisit\": \"5 days\",\n",
- " \"lift-off_mass\": \"1360 kg\",\n",
- " \"attitude_and_orbit_control\": \"3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
- " \"power\": \"Solar Array generating 1250 W, Two 24 Ah Ni-Cd batteries\",\n",
- " \"mission_life\": \"5 years\"\n",
+ " \"name\": \"\\n\\n The Technology Experiment Satellite\\n (TES)\\n \\n\",\n",
+ " \"id\": 28,\n",
+ " \"launch_date\": \"22 October 2001\",\n",
+ " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
+ " \"launch_vehicle\": \"PSLV- C3\",\n",
+ " \"orbit\": \"572 km Sun Synchronous\",\n",
+ " \"payloads\": \"PAN\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-3E\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"spacecraft_mass\": \"2,775 kg (Mass at Lift-off) 1218 kg (Dry mass)\",\n",
- " \"launch_date\": \"September 28, 2003\",\n",
+ " \"name\": \"\\n\\n INSAT-3C\\n \\n\",\n",
+ " \"id\": 29,\n",
+ " \"mission\": \"Communication, broadcasting and Meteorology\",\n",
+ " \"spacecraft_mass\": \"2,650 kg (Mass at Lift - off) 1218 kg (Dry mass)\",\n",
+ " \"onboard_power\": \"2765 W\",\n",
+ " \"propulsion\": \"Liquid Apogee Motor with fuel and oxidizer stored in separate titanium tanks and pressurant in Kevlar wound titanium tank.\",\n",
+ " \"payload\": \"24 C band transponders 6 Extended C - band Transponders 2 S - band Transponders\",\n",
+ " \"launch_date\": \"January 24, 2002\",\n",
" \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane5-V162\",\n",
- " \"orbit\": \"Geostationary Orbit\"\n",
+ " \"launch_vehicle\": \"Ariane5-V147\",\n",
+ " \"orbit\": \"Geostationary (74o longitude)\",\n",
+ " \"mission_life\": \"Very long\"\n",
" },\n",
" {\n",
- " \"name\": \"GSAT-2\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"weight\": \"1800 kg\",\n",
- " \"launch_date\": \"May 8, 2003\",\n",
- " \"launch_site\": \"SHAR, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"GSLV\\u2013D2\",\n",
- " \"orbit\": \"Geostationary orbit (48oE longitude)\"\n",
+ " \"name\": \"\\n\\n KALPANA-1\\n \\n\",\n",
+ " \"id\": 30,\n",
+ " \"mission\": \"7 Years\",\n",
+ " \"spacecraft_mass\": \"1060 kg mass (at Lift \\u2013 off) 498 kg (Dry mass)\",\n",
+ " \"onboard_power\": \"550 W\",\n",
+ " \"payload\": \"Very High Resolution Radiometer (VHRR) Data Relay Transponder (DRT)\",\n",
+ " \"launch_date\": \"12 September 2002\",\n",
+ " \"launch_site\": \"SHAR, Sriharikota\",\n",
+ " \"launch_vehicle\": \"PSLV \\u2013 C4\",\n",
+ " \"orbit\": \"Geostationary (74 deg East longitude)\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-3A\",\n",
- " \"id\": 1,\n",
+ " \"name\": \"\\n\\n INSAT-3A\\n \\n\",\n",
+ " \"id\": 31,\n",
" \"mission\": \"Telecommunication, broadcasting and Meteorology\",\n",
" \"spacecraft_mass\": \"2,950 kg (Mass at Lift\\u2013off) 1,348 kg (Dry mass)\",\n",
" \"onboard_power\": \"3,100 W\",\n",
@@ -522,493 +573,330 @@
" \"mission_life\": \"12 Years\"\n",
" },\n",
" {\n",
- " \"name\": \"KALPANA-1\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"7 Years\",\n",
- " \"spacecraft_mass\": \"1060 kg mass (at Lift \\u2013 off) 498 kg (Dry mass)\",\n",
- " \"onboard_power\": \"550 W\",\n",
- " \"payload\": \"Very High Resolution Radiometer (VHRR) Data Relay Transponder (DRT)\",\n",
- " \"launch_date\": \"12 September 2002\",\n",
- " \"launch_site\": \"SHAR, Sriharikota\",\n",
- " \"launch_vehicle\": \"PSLV \\u2013 C4\",\n",
- " \"orbit\": \"Geostationary (74 deg East longitude)\"\n",
- " },\n",
- " {\n",
- " \"name\": \"INSAT-3C\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication, broadcasting and Meteorology\",\n",
- " \"spacecraft_mass\": \"2,650 kg (Mass at Lift - off) 1218 kg (Dry mass)\",\n",
- " \"onboard_power\": \"2765 W\",\n",
- " \"propulsion\": \"Liquid Apogee Motor with fuel and oxidizer stored in separate titanium tanks and pressurant in Kevlar wound titanium tank.\",\n",
- " \"payload\": \"24 C band transponders 6 Extended C - band Transponders 2 S - band Transponders\",\n",
- " \"launch_date\": \"January 24, 2002\",\n",
- " \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane5-V147\",\n",
- " \"orbit\": \"Geostationary (74o longitude)\",\n",
- " \"mission_life\": \"Very long\"\n",
- " },\n",
- " {\n",
- " \"name\": \"The Technology Experiment Satellite\\n (TES)\",\n",
- " \"id\": 1,\n",
- " \"launch_date\": \"22 October 2001\",\n",
- " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C3\",\n",
- " \"orbit\": \"572 km Sun Synchronous\",\n",
- " \"payloads\": \"PAN\"\n",
- " },\n",
- " {\n",
- " \"name\": \"PSLV-C3 / TES\",\n",
- " \"id\": 1,\n",
- " \"launch_date\": \"22 October 2001\",\n",
- " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
- " \"launch_vehicle\": \"PSLV- C3\",\n",
- " \"orbit\": \"572 km Sun Synchronous\",\n",
- " \"payloads\": \"PAN\"\n",
- " },\n",
- " {\n",
- " \"name\": \"GSAT-1\",\n",
- " \"id\": 1,\n",
+ " \"name\": \"\\n\\n INSAT-3E\\n \\n\",\n",
+ " \"id\": 32,\n",
" \"mission\": \"Communication\",\n",
- " \"weight\": \"1530 kg\",\n",
- " \"launch_date\": \"18 April 2001\",\n",
- " \"launch_site\": \"SHAR, Sriharikota\",\n",
- " \"launch_vehicle\": \"GSLV \\u2013 D1\",\n",
- " \"orbit\": \"Sun Synchronous Geo stationary orbit\"\n",
- " },\n",
- " {\n",
- " \"name\": \"INSAT-3B\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Very long\",\n",
- " \"spacecraft_mass\": \"2,070 (Mass at Lift \\u2013 off) 970 kg (Dry mass)\",\n",
- " \"onboard_power\": \"1,712 W\",\n",
- " \"stabilization\": \"3 \\u2013 axis body stabilised biased momentum control system using earth sensors, sun sensors, inertial reference unit, momentum / reaction wheels, magnetic torquers and unified bi-propellant thrusters.\",\n",
- " \"propulsion\": \"Liquid Apogee Motor with fuel and oxidizer stored in separate titanium tanks and pressurant in Kevlar wound titanium tank.\",\n",
- " \"payload\": \"12 extended C \\u2013 band Transponders Five Ku band Transponders Mobile Satellite Services (MSS)\",\n",
- " \"launch_date\": \"22nd March 2000\",\n",
+ " \"spacecraft_mass\": \"2,775 kg (Mass at Lift-off) 1218 kg (Dry mass)\",\n",
+ " \"launch_date\": \"September 28, 2003\",\n",
" \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane -5\",\n",
- " \"orbit\": \"Geostationary (83 deg East longitude)\",\n",
- " \"inclination\": \"7 deg\"\n",
+ " \"launch_vehicle\": \"Ariane5-V162\",\n",
+ " \"orbit\": \"Geostationary Orbit\"\n",
" },\n",
" {\n",
- " \"name\": \"Oceansat(IRS-P4)\",\n",
- " \"id\": 1,\n",
- " \"launch_date\": \"May 26, 1999\",\n",
+ " \"name\": \"\\n\\n IRS-P6 / RESOURCESAT-1\\n \\n\",\n",
+ " \"id\": 33,\n",
+ " \"launch_date\": \"October 17, 2003\",\n",
" \"launch_site\": \"SHAR, Sriharikota\",\n",
- " \"launch_vehicle\": \"PSLV - C2\",\n",
+ " \"launch_vehicle\": \"PSLV-C5\",\n",
+ " \"payloads\": \"LISS-4, LISS-3, AWiFS-A, AWiFS-B\",\n",
" \"orbit\": \"Polar Sun Synchronous\",\n",
- " \"altitude\": \"720 km\",\n",
- " \"inclination\": \"98.28 deg\",\n",
- " \"period\": \"99.31 min\",\n",
- " \"local_time_of_eq._crossing\": \"12 noon\",\n",
- " \"repetitivity_cycle\": \"2 days\",\n",
- " \"size\": \"2.8m x 1.98m x 2.57m\",\n",
- " \"mass_at_lift_off\": \"1050 kg\",\n",
- " \"length_when_fully_deployed\": \"11.67 m\",\n",
- " \"attitude_and_orbit_control\": \"3-axis body-stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
- " \"power\": \"9.6 Sq.m Solar Array generating 750w Two 21 Ah Ni-Cd Batteries\",\n",
- " \"mission_completed_on\": \"August 8, 2010\"\n",
- " },\n",
- " {\n",
- " \"name\": \"INSAT-2E\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication and Meteorology\",\n",
- " \"spacecraft_mass\": \"2,550 kg (Mass at Lift-off) 1150 kg (Dry mass)\",\n",
- " \"launch_date\": \"03 April 1999\",\n",
- " \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane \\u2013 42P\",\n",
- " \"orbit\": \"Geosynchronous (83 deg east longitude)\"\n",
+ " \"orbit_height\": \"817 km\",\n",
+ " \"orbit_inclination\": \"98.7 o\",\n",
+ " \"orbit_period\": \"101.35 min\",\n",
+ " \"number_of_orbits_per_day\": \"14\",\n",
+ " \"local_time_of_equator_crossing\": \"10:30 am\",\n",
+ " \"repetivity_(liss-3)\": \"24 days\",\n",
+ " \"revisit\": \"5 days\",\n",
+ " \"lift-off_mass\": \"1360 kg\",\n",
+ " \"attitude_and_orbit_control\": \"3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
+ " \"power\": \"Solar Array generating 1250 W, Two 24 Ah Ni-Cd batteries\",\n",
+ " \"mission_life\": \"5 years\"\n",
" },\n",
" {\n",
- " \"name\": \"IRS-1D\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Operational Remote Sensing\",\n",
- " \"weight\": \"1250 kg\",\n",
- " \"onboard_power\": \"809 Watts (generated by 9.6 sq.metres Solar Panels)\",\n",
- " \"communication\": \"S-band, X-band\",\n",
- " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reaction Wheels, Magnetic torquer\",\n",
- " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 N thrusters & one 11N thrusters\",\n",
- " \"payload\": \"Three solid state Push Broom Cameras: PAN (<6 metre solution )LlSS-3(23.6 metre resolution) and WiFS (189 metre resolution)\",\n",
- " \"onboard_tape_recorder\": \"Storage Capacity : 62 G bits\",\n",
- " \"launch_date\": \"December 28, 1995\",\n",
- " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
- " \"launch_vehicle\": \"Molniya\",\n",
- " \"orbit\": \"817 km Polar Sun-synchronous\",\n",
- " \"inclination\": \"98.69o\",\n",
- " \"repetivity\": \"24 days\",\n",
- " \"local_time\": \"10.30 a.m\",\n",
- " \"mission_completed_on\": \"September 21, 2007\"\n",
+ " \"name\": \"\\n\\n EDUSAT\\n \\n\",\n",
+ " \"id\": 34,\n",
+ " \"mission\": \"Education\",\n",
+ " \"spacecraft_mass\": \"1950.5 kg mass (at Lift - off) 819.4 kg (Dry mass)\",\n",
+ " \"onboard_power\": \"Total four solar panel of size 2.54 M x 1.525 M generating 2040 W (EOL), two 24 AH NiCd batteries for eclipse support\",\n",
+ " \"stabilization\": \"3 axis body stabilised in orbit using sensors, momentum and reaction wheels, magnetic torquers and eight 10 N & 22N reaction control thrusters.\",\n",
+ " \"propulsion\": \"440 N Liquid Apogee Motor with MON - 3 and MMH for orbit raising\",\n",
+ " \"payload\": \"Six upper extended C - band transponders Five lower Ku band transponders with regional beam coverage One lower Ku band National beam transponder with Indian main land coverage Ku beacon 12 C band high power transponders with extended coverage, covering southeast and northwest region apart from Indian main land using 63 W LTWTAs\",\n",
+ " \"launch_date\": \"September 20, 2004\",\n",
+ " \"launch_site\": \"SHAR, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"GSLV-F01\",\n",
+ " \"orbit\": \"Geostationary (74 o E longitude)\",\n",
+ " \"mission_life\": \"7 Years (minimum)\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-2D\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Communication\",\n",
- " \"weight\": \"2079 kg with propellants, 995 kg dry weight\",\n",
- " \"onboard_power\": \"1650 Watts\",\n",
- " \"communication\": \"C, extended C, S and Ku bands\",\n",
- " \"stabilization\": \"Three axis stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
- " \"propulsion\": \"Integrated bipropellan stystem ( MMH and N2 04) With sixteen 22N thrusters and 440N LAM.\",\n",
- " \"payload\": \"Transponders: 16C-band / extended C-band transponders (forFSS), 2 high power C-band transponders (for BSS), 1S-band transponder (for BSS),1C/S-band mobile communication transponder, 3 Ku-band transponders\",\n",
- " \"launch_date\": \"June 4, 1997\",\n",
- " \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Arianev 4\",\n",
- " \"orbit\": \"Geostationary 93,.5deg.E\",\n",
- " \"inclination\": \"0 deg.\"\n",
+ " \"name\": \"\\n\\n CARTOSAT-1\\n \\n\",\n",
+ " \"id\": 35,\n",
+ " \"launch_date\": \"5 May 2005\",\n",
+ " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
+ " \"launch_vehicle\": \"PSLV- C6\",\n",
+ " \"orbit\": \"618 km Polar Sun Synchronous\",\n",
+ " \"payloads\": \"PAN FORE, PAN - AFT\",\n",
+ " \"orbit_period\": \"97 min\",\n",
+ " \"number_of_orbits_per_day\": \"14\",\n",
+ " \"local_time_of_equator_crossing\": \"10:30 am\",\n",
+ " \"repetivity\": \"126 days\",\n",
+ " \"revisit\": \"5 days\",\n",
+ " \"lift-off_mass\": \"1560 kg\",\n",
+ " \"attitude_and_orbit_control\": \"3-axis body stabillised using reaction wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
+ " \"electrical_power\": \"15 sqm Solar Array generating 1100w, Two 24 Ah Ni-Cd batteries\",\n",
+ " \"mission_life\": \"5 years\"\n",
" },\n",
" {\n",
- " \"name\": \"IRS-P3\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Remote sensing of earth's natural resources. Study of X-ray Astronomy. Periodic calibration of PSLV tracking radar located at tracking stations.\",\n",
- " \"weight\": \"920 kg\",\n",
- " \"onboard_power\": \"817 Watts\",\n",
- " \"communication\": \"S-band\",\n",
- " \"stabilization\": \"Three axis body stabilized\",\n",
- " \"rcs\": \"Combinations of bladder type and surface tension type mass expulsion monopropellant hydrazine system\",\n",
- " \"payload\": \"WideField Sensor (WiFS), Modular Opto - electronic Scanner (MOS), Indian X-ray Astronomy Experiment (IXAE), C-band transponder(CBT)\",\n",
- " \"launch_date\": \"March 21, 1996\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV-D3\",\n",
- " \"orbit\": \"817 km. Circular polar sun-synchronous with equatorial crossing at 10.30 am (descending node)\",\n",
- " \"inclination\": \"98.68o\",\n",
- " \"repetivity\": \"WiFS : 5 days\",\n",
- " \"mission_completed_during\": \"January 2006\"\n",
+ " \"name\": \"\\n\\n INSAT-4A\\n \\n\",\n",
+ " \"id\": 36,\n",
+ " \"spacecraft_mass\": \"Lift off 3081 Kg Dry Mass 1386.55 Kg\",\n",
+ " \"orbit\": \"Geostationary ( 83o E)\",\n",
+ " \"power\": \"Solar Array to provide a power of 5922 W\",\n",
+ " \"battery\": \"Three 70 Ah Ni H2 Batteries for eclipse support of 4264 W\",\n",
+ " \"life\": \"12 Years\",\n",
+ " \"launch_date\": \"December 22, 2005\",\n",
+ " \"launch_vehicle\": \"ARIANE5-V169\"\n",
" },\n",
" {\n",
- " \"name\": \"IRS-1C\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Operational Remote Sensing\",\n",
- " \"weight\": \"1250 kg\",\n",
- " \"onboard_power\": \"809 Watts (generated by 9.6 sq.metres Solar Panels)\",\n",
- " \"communication\": \"S-band, X-band\",\n",
- " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reaction Wheels, Magnetic torquer\",\n",
- " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 N thrusters & one 11N thrusters\",\n",
- " \"payload\": \"Three solid state Push Broom Cameras: PAN (<6 metre solution )LlSS-3(23.6 metre resolution) and WiFS (189 metre resolution)\",\n",
- " \"onboard_tape_recorder\": \"Storage Capacity : 62 G bits\",\n",
- " \"launch_date\": \"December 28, 1995\",\n",
- " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
- " \"launch_vehicle\": \"Molniya\",\n",
- " \"orbit\": \"817 km Polar Sun-synchronous\",\n",
- " \"inclination\": \"98.69o\",\n",
- " \"repetivity\": \"24 days\",\n",
- " \"local_time\": \"10.30 a.m\",\n",
- " \"mission_completed_on\": \"September 21, 2007\"\n",
+ " \"name\": \"\\n\\n CARTOSAT-2\\n \\n\",\n",
+ " \"id\": 37,\n",
+ " \"mission\": \"Remote Sensing\",\n",
+ " \"weight\": \"650 Kg\",\n",
+ " \"onboard_orbit\": \"900 Watts\",\n",
+ " \"stabilization\": \"3 - axis body stabilised using high torque reaction wheels, magnetic torquers and thrusters\",\n",
+ " \"payloads\": \"Panchromatic Camera\",\n",
+ " \"launch_date\": \"10 January 2007\",\n",
+ " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
+ " \"launch_vehicle\": \"PSLV- C7\",\n",
+ " \"orbit\": \"Polar Sun Synchronous\",\n",
+ " \"mission_life\": \"5 years\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-2C\",\n",
- " \"id\": 1,\n",
+ " \"name\": \"\\n\\n INSAT-4B\\n \\n\",\n",
+ " \"id\": 38,\n",
" \"mission\": \"Communication\",\n",
- " \"weight\": \"2106 kg with propellants 946 kg dry weight\",\n",
- " \"onboard_power\": \"1320 Watts\",\n",
- " \"communication\": \"C extended C, S and Ku bands\",\n",
- " \"stabilization\": \"Three axis stabilized with two Momen'tum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
- " \"propulsion\": \"Integrated bipropellant system ( MMH and N2 04) With sixteen 22N thrusters and 440N LAM.\",\n",
- " \"payload\": \"Transponders: 16C-band / extended C-band transponders (for FSS), 2 high power C-band transponders (for BSS), 1S-band transponder (for BSS),1C/S-band mobile communication transponder, 3 Ku-band transponders\",\n",
- " \"launch_date\": \"December 7, 1995\",\n",
- " \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane4\",\n",
- " \"orbit\": \"Geostationary 93.5 deg E\",\n",
- " \"inclination\": \"0 deg.\",\n",
- " \"mission_life\": \"Seven years(nominal)\",\n",
- " \"orbit_life\": \"Very Long\"\n",
- " },\n",
- " {\n",
- " \"name\": \"IRS-P2\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Operational Remote Sensing\",\n",
- " \"weight\": \"804 kg\",\n",
- " \"onboard_power\": \"510 Watts\",\n",
- " \"communication\": \"S-band, X-band\",\n",
- " \"stabilization\": \"Three axis body stabilized with 4 Reaction Wheels, Magnetic torquers\",\n",
- " \"rcs\": \"4 tanks containing Monopropellant Hydrazine based with sixteen 1 N thrusters and one 11 N thruster\",\n",
- " \"payload\": \"Two solid state Push Broom Cameras operating in four spectral bands in the visible and near-IR range using CCD arrays: LlSS-2A & LlSS-2B (Resolution: 32.74 metre)\",\n",
- " \"launch_date\": \"October 15, 1994\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV-D2\",\n",
- " \"inclination\": \"98.68o\",\n",
- " \"repetivity\": \"24 days\",\n",
- " \"mission_completed_on\": \"1997\"\n",
- " },\n",
- " {\n",
- " \"name\": \"SROSS-C2\\n \",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"115 kg\",\n",
- " \"onboard_power\": \"45 Watts\",\n",
- " \"communication\": \"S-band and VHF\",\n",
- " \"rcs\": \"Monopropellant Hydrazine based with six 1 Newton thrusters\",\n",
- " \"payload\": \"Gamma Ray Burst (GRB) & Retarding Potential Analyser (RPA)\",\n",
- " \"launch_date\": \"May 04,1994\",\n",
- " \"launch_site\": \"SHAR Centre,Sriharikota,India\",\n",
- " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
- " \"orbit\": \"430 x 600 km.\",\n",
- " \"inclination\": \"45 deg.\",\n",
- " \"mission_life\": \"Six months (nominal)\",\n",
- " \"orbital_life\": \"Two years (nominal)\"\n",
- " },\n",
- " {\n",
- " \"name\": \"IRS-1E\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Operational Remote Sensing\",\n",
- " \"weight\": \"846 kg\",\n",
- " \"onboard_power\": \"415 Watts\",\n",
- " \"communication\": \"S-band (TIC) & VHF\",\n",
- " \"stabilization\": \"Three axis body stabilized ( zero momentum) with 4 Reaction Wheels, Magnetic torquers\",\n",
- " \"rcs\": \"Monopropellant Hydrazine based RCS with 1 Newton thrusters ( 16 Nos.)\",\n",
- " \"payload\": \"LlSS-1 MEOSS (Mono-ocula Erlectro Optic Stereo Scanner)\",\n",
- " \"launch_date\": \"September 20, 1993\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"PSLV-D1\",\n",
- " \"orbit\": \"Not realised\"\n",
+ " \"weight\": \"3025 kg (at Lift \\u2013 off)\",\n",
+ " \"onboard_power\": \"5859 W\",\n",
+ " \"stabilization\": \"It uses 3 earth sensors, 2 digital sun sensors, 8 coarse analog sun sensors, 3 solar panel sun sensors and one sensor processing electronics. The wheels and wheel drive electronics were imported with indigenous wheel interface module to interface the wheel drive electronics and AOCE.\",\n",
+ " \"propulsion\": \"The propulsion system is employing 16 thrusters, 4 each located on east, west and AY sides and 2 each on north and south sides. There is one 440 N liquid apogee motor (using Mono Methyl Hydrazine (MMH) as fuel and oxides of Nitrogen (MON3 as oxidizer) and three pressurant tanks mounted on the LAM deck.\",\n",
+ " \"payload\": \"12 Ku band high power transponders covering Indian main land using 140W radiatively cooled TWTAs.\",\n",
+ " \"launch_date\": \"March 12, 2007\",\n",
+ " \"launch_site\": \"French Guiana\",\n",
+ " \"launch_vehicle\": \"Ariane5\",\n",
+ " \"orbit\": \"Geostationary (93.5 o E Longitude)\",\n",
+ " \"mission_life\": \"12 Years\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-2B\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Multipurpose Communication, meteorology and Satellite based search and rescue\",\n",
- " \"weight\": \"1906 kg with propellant 916 kg dry weight\",\n",
- " \"onboard_power\": \"One KW approx.\",\n",
- " \"communication\": \"C, extended C and S band\",\n",
- " \"stabilization\": \"Three axis body stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
- " \"propulsion\": \"Integrated bipropellant system ( MMH and N2 04) With sixteen 22 N thrusters and 440 N LAM.\",\n",
- " \"payload\": \"Transponders: 12C-band (for FSS),6 ext. C-band (for FSS) 2S-band (for BSS),1Data relay transponder (for met.data), 1 transponder for research and rescue, Very High Resolution radiometer (VHRR) for meteorological observation with 2 km resolution in the visible and 8 km resolution in the IR band\",\n",
- " \"launch_date\": \"July 23, 1993\",\n",
- " \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane 4\",\n",
- " \"orbit\": \"Geostationary 93.5o E\",\n",
- " \"inclination\": \"0o\",\n",
- " \"mission_life\": \"Seven years(nominal)\",\n",
- " \"orbit_life\": \"Very Long\"\n",
+ " \"name\": \"\\n\\n INSAT-4CR\\n \\n\",\n",
+ " \"id\": 39,\n",
+ " \"mission\": \"Communication\",\n",
+ " \"weight\": \"2,130 kg (Mass at Lift \\u2013 off)\",\n",
+ " \"onboard_power\": \"3000 W\",\n",
+ " \"communication_payload\": \"12 Ku-band transponders employing 140 W Traveling Wave Tube Amplifiers (TWTA) Ku-band Beacon\",\n",
+ " \"launch_date\": \"September 2, 2007\",\n",
+ " \"launch_site\": \"SHAR, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"GSLV-F04\",\n",
+ " \"orbit\": \"Geosynchronous (74\\u00b0 E)\",\n",
+ " \"mission_life\": \"12 Years\"\n",
" },\n",
" {\n",
- " \"name\": \"INSAT-2A\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Multipurpose Communication, meteorology and Satellite based search and rescue\",\n",
- " \"weight\": \"1906 kg with propellant 916 kg dry weight\",\n",
- " \"onboard_power\": \"One KW approx\",\n",
- " \"communication\": \"C, extended C and S band\",\n",
- " \"stabilization\": \"Three axis body stabilized with two Momentum Wheels & one Reaction Wheel, Magnetic torquers\",\n",
- " \"propulsion\": \"Integrated bipropellant system (MMH and N2 04) With sixteen 22 N thrusters and 440 LAM.\",\n",
- " \"payload\": \"Transponders: 12 C-band (for FSS),6 ext. C-band (for FSS) 2 S-band (for BSS),1Data relay transponder (for met.data), 1 transponder for research and rescue, Very High Resolution radiometer (VHRR) for\\u00a0meteorological observation with 2 km resolution in the visible and 8 km resolution in the IR band\",\n",
- " \"launch_date\": \"July 10,1992\",\n",
- " \"launch_site\": \"French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane 4\",\n",
- " \"orbit\": \"Geostationary 74oE longitude\",\n",
- " \"inclination\": \"0o\",\n",
- " \"mission_life\": \"Seven years(nominal)\",\n",
- " \"orbit_life\": \"Very Long\"\n",
+ " \"name\": \"\\n\\n CARTOSAT \\u2013\\n 2A\\n \\n\",\n",
+ " \"id\": 40,\n",
+ " \"mission\": \"Remote Sensing\",\n",
+ " \"weight\": \"690 Kg (Mass at lift off)\",\n",
+ " \"onboard_power\": \"900 Watts\",\n",
+ " \"stabilization\": \"3 \\u2013 axis body stabilised using high torque reaction wheels, magnetic torquers and hydrogen thrusters\",\n",
+ " \"payloads\": \"Panchromatic Camera\",\n",
+ " \"launch_date\": \"28 April 2008\",\n",
+ " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
+ " \"launch_vehicle\": \"PSLV- C9\",\n",
+ " \"orbit\": \"635 km, Polar Sun Synchronous\",\n",
+ " \"inclination\": \"97.94 deg\",\n",
+ " \"mission_life\": \"5 years\"\n",
" },\n",
" {\n",
- " \"name\": \"SROSS-C\\n\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"106.1 kg\",\n",
- " \"onboard_power\": \"45 Watts\",\n",
- " \"communication\": \"S-band and VHF\",\n",
- " \"stabilization\": \"Spin stabilized with a Magnetic Torquer and Magnetic Bias Control\",\n",
- " \"payload\": \"Gamma Ray Burst (GRB) experiment & Retarding Potential Analyser (RPA) experiment\",\n",
- " \"launch_date\": \"May 20,1992\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
- " \"orbit\": \"267 x 391 km\",\n",
- " \"mission_life\": \"Two months (Re-entered on July15,1992)\"\n",
+ " \"name\": \"\\n\\n IMS-1\\n \\n\",\n",
+ " \"id\": 41,\n",
+ " \"orbit\": \"Polar Sun Synchronous\",\n",
+ " \"altitude\": \"635 km\",\n",
+ " \"mission_life\": \"2 years\",\n",
+ " \"physical_dimensions\": \"0.604x0.980x1.129 m\",\n",
+ " \"mass\": \"83 kg\",\n",
+ " \"power\": \"Two deployable sun pointing solar panels generating 220 W power, 105 Ah Lithium ion battery\",\n",
+ " \"telemetry,_tracking_and_command\": \"S-band\",\n",
+ " \"attitude_and_orbit_control_system\": \"Star Sensor, Miniature Sun Sensors, Magnetometers Gyros, Miniature Micro Reaction Wheels, Magnetic Torquers, single 1 N Hydrazine Thruster\",\n",
+ " \"data_handling\": \"S-band\",\n",
+ " \"data_storage\": \"16 Gb Solid State Recorder\"\n",
" },\n",
" {\n",
- " \"name\": \"IRS-1B\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Operational Remote Sensing\",\n",
- " \"weight\": \"975 kg\",\n",
- " \"onboard_power\": \"600 Watts\",\n",
- " \"communication\": \"S-band, X-band and VHF (commanding only)\",\n",
- " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reactions Wheels, Magnetic torquers\",\n",
- " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 Newton thrusters\",\n",
- " \"payload\": \"Three solid state Push Broom Cameras LlSS-1 (72.5 metre resolution), LlSS-2A and LlSS-2B (36.25 metre resolution)\",\n",
- " \"launch_date\": \"August 29, 1991\",\n",
- " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
- " \"launch_vehicle\": \"Vostok\",\n",
- " \"orbit\": \"904 km Polar Sun Synchronous\",\n",
- " \"inclination\": \"99.08o\",\n",
- " \"repetivity\": \"22 days\",\n",
- " \"local_time\": \"10.30 a.m. (descending node)\",\n",
- " \"mission_completed_on\": \"December 20, 2003\"\n",
+ " \"name\": \"\\n\\n Chandrayaan-1\\n \\n\",\n",
+ " \"id\": 42,\n",
+ " \"mission\": \"Remote Sensing, Planetary Science\",\n",
+ " \"weight\": \"1380 kg (Mass at lift off)\",\n",
+ " \"onboard_power\": \"700 Watts\",\n",
+ " \"stabilization\": \"3 - axis stabilised using reaction wheel and attitude control thrusters, sun sensors, star sensors, fibre optic gyros and accelerometers for attitude determination.\",\n",
+ " \"launch_date\": \"22 October 2008\",\n",
+ " \"launch_site\": \"SDSC, SHAR, Sriharikota\",\n",
+ " \"launch_vehicle\": \"PSLV - C11\",\n",
+ " \"orbit\": \"100 km x 100 km : Lunar Orbit\",\n",
+ " \"mission_life\": \"2 years\"\n",
" },\n",
" {\n",
- " \"name\": \"SROSS-2\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"150 kg\",\n",
- " \"onboard_power\": \"90 Watts\",\n",
- " \"communication\": \"S-band and VHF\",\n",
- " \"stabilization\": \"Three axis body stabilized (biased momentum) with a Momentum Wheel and Magnetic Torquer\",\n",
- " \"propulsion_system\": \"Monopropellant (Hydrazine based) Reaction Control System\",\n",
- " \"payload\": \"Gamma Ray Burst (GRB) payload and Mono Payload Ocular Electro-Optic Stereo Scanner (MEOSS) built by DLR, Germany\",\n",
- " \"launch_date\": \"July 13, 1988\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
- " \"orbit\": \"Not realised\"\n",
+ " \"name\": \"\\n\\n RISAT-2\\n \\n\",\n",
+ " \"id\": 43,\n",
+ " \"altitude\": \"550 km\",\n",
+ " \"inclination\": \"41 deg\",\n",
+ " \"orbit_period\": \"90 minutes\",\n",
+ " \"mass\": \"300 kg\"\n",
" },\n",
" {\n",
- " \"name\": \"IRS-1A\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Operational Remote Sensing\",\n",
- " \"weight\": \"975 kg\",\n",
- " \"onboard_power\": \"600 Watts\",\n",
- " \"communication\": \"S-band, X-band and VHF(commanding only)\",\n",
- " \"stabilization\": \"Three axis body stabilized (zero momentum) with 4 Reactions Wheels, Magnetic torquers\",\n",
- " \"rcs\": \"Monopropellant Hydrazine based with sixteen 1 Newton thrusters\",\n",
- " \"payload\": \"Three solid state Push Broom Cameras: LISS-1(72.5 metre resolution), LISS-2A and LISS-2B (36.25 metre resolution)\",\n",
- " \"launch_date\": \"March 17, 1988\",\n",
- " \"launch_site\": \"Baikanur Cosmodrome Kazakhstan\",\n",
- " \"launch_vehicle\": \"Vostok\",\n",
- " \"orbit\": \"904 km Polar Sun-synchronous\",\n",
- " \"inclination\": \"99.08o\",\n",
- " \"repetivity\": \"22 days (307 orbits)\",\n",
- " \"local_time\": \"10.30 a.m. (descending node)\",\n",
- " \"mission_completed_during\": \"July 1996\"\n",
+ " \"name\": \"\\n\\n Oceansat-2\\n \\n\",\n",
+ " \"id\": 44,\n",
+ " \"date\": \"Sept 23, 2009\",\n",
+ " \"launch_site\": \"SHAR, Sriharikota\",\n",
+ " \"launch_vehicle\": \"PSLV - C14\",\n",
+ " \"orbit\": \"Polar Sun Synchronous\",\n",
+ " \"altitude\": \"720 km\",\n",
+ " \"inclination\": \"98.28\\u00b0\",\n",
+ " \"period\": \"99.31 minutes\",\n",
+ " \"local_time_of_eq._crossing\": \"12 noon \\u00b1 10 minutes\",\n",
+ " \"repetitivity_cycle\": \"2 days\",\n",
+ " \"payloads\": \"OCM, SCAT and ROSA\",\n",
+ " \"mass_at_lift_off\": \"960 kg\",\n",
+ " \"power\": \"15 Sq.m Solar panels generating 1360W, Two 24 Ah Ni-Cd Batteries\",\n",
+ " \"mission_life\": \"5 years\"\n",
" },\n",
" {\n",
- " \"name\": \"SROSS-1\\n\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"150 kg\",\n",
- " \"onboard_power\": \"90 Watts\",\n",
- " \"communication\": \"S-band and VHF\",\n",
- " \"stabilization\": \"Three axis body stabilized (biased momentum) with a Momentum Wheel and Magnetic Torquer\",\n",
- " \"propulsion_system\": \"Monopropellant (Hydrazine based) Reaction control system\",\n",
- " \"payload\": \"Launch Vehicle Monitoring Platform(LVMP), Gamma Ray Burst (GRB) payload and Corner Cube Retro Reflector (CCRR) for laser tracking\",\n",
- " \"launch_date\": \"March 24, 1987\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"Augmented Satellite Launch Vehicle (ASLV)\",\n",
- " \"orbital_life\": \"Not realised\"\n",
+ " \"name\": \"\\n\\n CARTOSAT-2B\\n \\n\",\n",
+ " \"id\": 45,\n",
+ " \"mission\": \"Remote Sensing\",\n",
+ " \"weight\": \"694 kg (Mass at lift off)\",\n",
+ " \"onboard_orbit\": \"930 Watts\",\n",
+ " \"stabilization\": \"3 \\u2013 axis body stabilised based on inputs from star sensors and gyros using Reaction wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
+ " \"payloads\": \"Panchromatic Camera\",\n",
+ " \"launch_date\": \"July 12, 2010\",\n",
+ " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
+ " \"launch_vehicle\": \"PSLV- C15\",\n",
+ " \"orbit\": \"630 kms, Polar Sun Synchronous\",\n",
+ " \"inclination\": \"97.71\\u00ba\"\n",
" },\n",
" {\n",
- " \"name\": \"Rohini Satellite RS-D2\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"41.5 kg\",\n",
- " \"onboard_power\": \"16 Watts\",\n",
- " \"communication\": \"VHF band\",\n",
- " \"stabilization\": \"Spin stabilized\",\n",
- " \"payload\": \"Smart sensor (remote sensing payload), L-band beacon\",\n",
- " \"launch_date\": \"April 17, 1983\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"SLV-3\",\n",
- " \"orbit\": \"371 x 861 km\",\n",
- " \"inclination\": \"46o\",\n",
- " \"mission_life\": \"17 months\",\n",
- " \"orbital_life\": \"Seven years (Re-entered on April 19, 1990)\"\n",
+ " \"name\": \"\\n\\n RESOURCESAT-2\\n \\n\",\n",
+ " \"id\": 46,\n",
+ " \"mission\": \"Remote Sensing\",\n",
+ " \"orbit\": \"Circular Polar Sun Synchronous\",\n",
+ " \"orbit_altitude_at_injection\": \"822 km + 20 km (3 Sigma)\",\n",
+ " \"orbit_inclination\": \"98.731\\u00ba + 0.2\\u00ba\",\n",
+ " \"lift-off_mass\": \"1206 kg\",\n",
+ " \"orbit_period\": \"101.35 min\",\n",
+ " \"number_of_orbits_per_day\": \"14\",\n",
+ " \"local_time_of_equator_crossing\": \"10:30 am\",\n",
+ " \"repetivity\": \"24 days\",\n",
+ " \"attitude_and_orbit_control\": \"3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
+ " \"power\": \"Solar Array generating 1250 W at End Of Life, two 24 AH Ni-Cd batteries\",\n",
+ " \"launch_date\": \"April 20, 2011\",\n",
+ " \"launch_site\": \"SHAR Centre Sriharikota India\",\n",
+ " \"launch_vehicle\": \"PSLV- C16\",\n",
+ " \"mission_life\": \"5 years\"\n",
" },\n",
" {\n",
- " \"name\": \"Bhaskara-II\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental Remote Sensing\",\n",
- " \"weight\": \"444 kg\",\n",
- " \"onboard_power\": \"47 Watts\",\n",
- " \"communication\": \"VHF band\",\n",
- " \"stabilization\": \"Spin stabilized (spin axis controlled)\",\n",
- " \"payload\": \"TV cameras, three band Microwave Radiometer (SAMIR)\",\n",
- " \"launch_date\": \"Nov 20, 1981\",\n",
- " \"launch_site\": \"Volgograd Launch Station (presently in Russia)\",\n",
- " \"launch_vehicle\": \"C-1 Intercosmos\",\n",
- " \"orbit\": \"541 x 557 km\",\n",
- " \"inclination\": \"50.7o\",\n",
- " \"mission_life\": \"One year (nominal)\",\n",
- " \"orbital_life\": \"About 10 years ( Re-entered in 1991 )\"\n",
+ " \"name\": \"\\n\\n Megha-Tropiques\\n \\n\",\n",
+ " \"id\": 47,\n",
+ " \"lift-off_mass\": \"1000 kg\",\n",
+ " \"orbit\": \"867 km with an inclination of 20 deg to the equator\",\n",
+ " \"thermal\": \"Passive system with IRS heritage\",\n",
+ " \"power\": \"1325 W (at End of Life) Two 24 AH NiCd batteries\",\n",
+ " \"ttc\": \"S-band\",\n",
+ " \"attitude_and_orbit_control\": \"3-axis stabilised with 4 Reaction Wheels, Gyros and Star sensors, Hydrazine based RCS\",\n",
+ " \"solid_state_recorder\": \"16 Gb\",\n",
+ " \"launch_date\": \"October 12, 2011\",\n",
+ " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV- C18\"\n",
" },\n",
" {\n",
- " \"name\": \"APPLE\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental geostationary communication\",\n",
- " \"weight\": \"670 kg\",\n",
- " \"onboard_power\": \"210 Watts\",\n",
- " \"communication\": \"VHF and C-band\",\n",
- " \"stabilization\": \"Three axis stabilized (biased momentum) with Momentum Wheels, Torquers & \\u00a0Hydrazine based Reaction control system\",\n",
- " \"payload\": \"C - band transponders (Two)\",\n",
- " \"launch_date\": \"June19,1981\",\n",
- " \"launch_site\": \"Kourou (CSG), French Guyana\",\n",
- " \"launch_vehicle\": \"Ariane -1(V-3)\",\n",
- " \"orbit\": \"Geosynchronous (102 deg. E\\u00a0 longitude, over Indonesia)\",\n",
- " \"inclination\": \"Near zero\",\n",
- " \"mission_life\": \"Two years\"\n",
+ " \"name\": \"\\n\\n RISAT-1\\n \\n\",\n",
+ " \"id\": 48,\n",
+ " \"mass\": \"1858 kg\",\n",
+ " \"orbit\": \"Circular Polar Sun Synchronous\",\n",
+ " \"orbit_altitude\": \"536 km\",\n",
+ " \"orbit_inclination\": \"97.552 o\",\n",
+ " \"orbit_period\": \"95.49 min\",\n",
+ " \"number_of_orbits_per_day\": \"14\",\n",
+ " \"local_time_of_equator_crossing\": \"6:00 am / 6:00 pm\",\n",
+ " \"power\": \"Solar Array generating 2200 W and one 70 AH Ni-H2 battery\",\n",
+ " \"repetivity\": \"25 days\",\n",
+ " \"attitude_and_orbit_control\": \"3-axis body stabilised using Reaction Wheels, Magnetic Torquers and Hydrazine Thrusters\",\n",
+ " \"nominal_mission_life\": \"5 years\",\n",
+ " \"launch_date\": \"April 26, 2012\",\n",
+ " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV- C19\"\n",
" },\n",
" {\n",
- " \"name\": \"Rohini Satellite RS-D1\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"38 kg\",\n",
- " \"onboard_power\": \"16 Watts\",\n",
- " \"communication\": \"VHF band\",\n",
- " \"stabilization\": \"Spin stabilized\",\n",
- " \"payload\": \"Landmark Tracker ( remote sensing payload)\",\n",
- " \"launch_date\": \"May 31,1981\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"SLV-3\",\n",
- " \"orbit\": \"186 x 418 km (achieved)\",\n",
- " \"inclination\": \"46 deg\",\n",
- " \"orbital_life\": \"Nine days\"\n",
+ " \"name\": \"\\n\\n SARAL\\n \\n\",\n",
+ " \"id\": 49,\n",
+ " \"lift-off_mass\": \"407 kg\",\n",
+ " \"orbit\": \"781 km polar Sun synchronous\",\n",
+ " \"sensors\": \"4 PI sun sensors, magnetometer, star sensors and miniaturised gyro based Inertial Reference Unit\",\n",
+ " \"orbit_inclination\": \"98.538 o\",\n",
+ " \"local_time_of_equator\": \"18:00 hours crossing\",\n",
+ " \"power\": \"Solar Array generating 906 W and 46.8 Ampere-hour Lithium-ion battery\",\n",
+ " \"onboard_data_storage\": \"32 Gb\",\n",
+ " \"attitude_and_orbit_control\": \"3-axis stabilisation with reaction wheels, Hydrazine Control System based thrusters\",\n",
+ " \"mission_life\": \"5 years\",\n",
+ " \"launch_date\": \"Feb 25, 2013\",\n",
+ " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV - C20\"\n",
" },\n",
" {\n",
- " \"name\": \"Rohini Satellite RS-1\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"35 kg\",\n",
- " \"onboard_power\": \"16 Watts\",\n",
- " \"communication\": \"VHF band\",\n",
- " \"stabilization\": \"Spin stabilized\",\n",
- " \"payload\": \"Launch vehicle monitoring instruments\",\n",
- " \"launch_date\": \"July 18,1980\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"SLV-3\",\n",
- " \"orbit\": \"305 x 919 km\",\n",
- " \"inclination\": \"44.7 deg.\",\n",
- " \"mission_life\": \"1.2 years\",\n",
- " \"orbital_life\": \"20 months\"\n",
+ " \"name\": \"\\n\\n IRNSS-1A\\n \\n\",\n",
+ " \"id\": 50,\n",
+ " \"lift-off_mass\": \"1425 kg\",\n",
+ " \"physical_dimensions\": \"1.58 metre x 1.50 metre x 1.50 metre\",\n",
+ " \"orbit\": \"Geosynchronous, at 55 deg East longitude with 29 deg inclination\",\n",
+ " \"power\": \"Two solar panels generating 1660 W, one lithium-ion battery of 90 Ampere-Hour capacity\",\n",
+ " \"propulsion\": \"440 Newton Liquid Apogee Motor, twelve 22 Newton Thrusters\",\n",
+ " \"control_system\": \"Zero momentum system, orientation input from Sun & star Sensors and Gyroscopes; Reaction Wheels, Magnetic Torquers and 22 Newton thrusters as actuators\",\n",
+ " \"mission_life\": \"10 years\",\n",
+ " \"launch_date\": \"Jul 01, 2013\",\n",
+ " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV - C22\"\n",
" },\n",
" {\n",
- " \"name\": \"Rohini Technology Payload\\n (RTP)\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental\",\n",
- " \"weight\": \"35 kg\",\n",
- " \"onboard_power\": \"3 Watts\",\n",
- " \"communication\": \"VHF band\",\n",
- " \"stabilization\": \"Spin stabilized (spin axis controlled)\",\n",
- " \"payload\": \"Launch vehicle monitoring instruments\",\n",
- " \"launch_date\": \"August 10,1979\",\n",
- " \"launch_site\": \"SHAR Centre, Sriharikota, India\",\n",
- " \"launch_vehicle\": \"SLV-3\",\n",
- " \"orbit\": \"Not achieved\"\n",
+ " \"name\": \"\\n\\n INSAT-3D\\n \\n\",\n",
+ " \"id\": 51,\n",
+ " \"mission\": \"Meteorological and Search & Rescue Services\",\n",
+ " \"mass_at_lift-off\": \"2060 kg\",\n",
+ " \"power\": \"Solar panel generating 1164 W Two 18 Ah Ni-Cd batteries\",\n",
+ " \"physical_dimensions\": \"2.4m x 1.6m x 1.5m\",\n",
+ " \"propulsion\": \"440 Newton Liquid Apogee Motor (LAM) and twelve 22 Newton thrusters with Mono Methyl Hydrazine (MMH) as fuel and mixed Oxides of Nitrogen (MON-3) as oxidizer\",\n",
+ " \"stabilisation\": \"3-asix body stabilized in orbit using Sun Sensors, Star Sensors, gyroscopes, Momentum and Reaction Wheels, Magnetic Torquers and thrusters\",\n",
+ " \"antennae\": \"0.9m and 1.0m body mounted antennas\",\n",
+ " \"launch_date\": \"July 26, 2013\",\n",
+ " \"launch_site\": \"Kourou, French Guiana\",\n",
+ " \"launch_vehicle\": \"Ariane-5 VA-214\",\n",
+ " \"orbit\": \"Geostationary, 82 deg E Longitude\",\n",
+ " \"mission_life\": \"7 Years\"\n",
" },\n",
" {\n",
- " \"name\": \"Bhaskara-I\",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Experimental Remote Sensing\",\n",
- " \"weight\": \"442 kg\",\n",
- " \"onboard_power\": \"47 Watts\",\n",
- " \"communication\": \"VHF band\",\n",
- " \"stabilization\": \"Spin stabilized (spin axis controlled)\",\n",
- " \"payload\": \"TVcameras, three band Microwave Radiometer (SAMIR)\",\n",
- " \"launch_date\": \"Jun 07,1979\",\n",
- " \"launch_site\": \"Volgograd Launch Station (presently in Russia)\",\n",
- " \"launch_vehicle\": \"C-1Intercosmos\",\n",
- " \"orbit\": \"519 x 541 km\",\n",
- " \"inclination\": \"50.6 deg\",\n",
- " \"mission_life\": \"One year (nominal)\",\n",
- " \"orbital_life\": \"About 10 years ( Re-entered in 1989 )\"\n",
+ " \"name\": \"\\n\\n IRNSS-1B\\n \\n\",\n",
+ " \"id\": 52,\n",
+ " \"off_mass\": \"1432 kg\",\n",
+ " \"physical_dimensions\": \"1.58 metre x 1.50 metre x 1.50 metre\",\n",
+ " \"orbit\": \"Geosynchronous, at 55 deg East longitude with 29 deg inclination\",\n",
+ " \"power\": \"Two solar panels generating 1660 W, one lithium-ion battery of 90 Ampere-Hour capacity\",\n",
+ " \"propulsion\": \"440 Newton Liquid Apogee Motor, twelve 22 Newton Thrusters\",\n",
+ " \"control_system\": \"Zero momentum system, orientation input from Sun & star Sensors and Gyroscopes; Reaction Wheels, Magnetic Torquers and 22 Newton thrusters as actuators\",\n",
+ " \"mission_life\": \"10 years\",\n",
+ " \"launch_date\": \"Apr 04, 2014\",\n",
+ " \"launch_site\": \"SDSC SHAR Centre, Sriharikota, India\",\n",
+ " \"launch_vehicle\": \"PSLV - C24\"\n",
" },\n",
" {\n",
- " \"name\": \"Aryabhata \",\n",
- " \"id\": 1,\n",
- " \"mission\": \"Scientific/ Experimental\",\n",
- " \"weight\": \"360 kg\",\n",
- " \"on_board_power\": \"46 Watts\",\n",
- " \"communication\": \"VHF band\",\n",
- " \"stabilization\": \"Spinstabilize\",\n",
- " \"payload\": \"X-ray Astronomy Aeronomy & Solar Physics\",\n",
- " \"launch_date\": \"April 19, 1975\",\n",
- " \"launch_site\": \"Volgograd Launch Station (presently in Russia)\",\n",
- " \"launch_vehicle\": \"C-1 Intercosmos\",\n",
- " \"orbit\": \"563 x 619 km\",\n",
- " \"inclination\": \"50.7 deg\",\n",
- " \"mission_life\": \"6 months(nominal), Spacecraft mainframe active till March,1981\",\n",
- " \"orbital_life\": \"Nearly seventeen years (Re-entered on February 10,1992)\"\n",
+ " \"name\": \"\\n\\n Cartosat-3\\n \\n\",\n",
+ " \"id\": 53,\n",
+ " \"mean________________________________________________________________altitude\": \"509 km\",\n",
+ " \"mean_inclination\": \"97.5\\u00b0\",\n",
+ " \"overall_mass\": \"1625 kg\",\n",
+ " \"power_generation\": \"2000W\",\n",
+ " \"mission_life\": \"5 years\"\n",
+ " },\n",
+ " {\n",
+ " \"name\": \"\\n\\n RISAT-2BR1\\n \\n\",\n",
+ " \"id\": 54,\n",
+ " \"lift-off_weight\": \"628 kg\",\n",
+ " \"altitude\": \"576 km\",\n",
+ " \"payload\": \"X-Band Radar\",\n",
+ " \"inclination\": \"37 deg\",\n",
+ " \"mission_life\": \"5 years\"\n",
" }\n",
"]\n"
]
@@ -1022,7 +910,7 @@
" link = spacecraft[\"href\"]\n",
" url = \"https://www.isro.gov.in/{craft}\".format(craft=link)\n",
" response = requests.get(url)\n",
- " soup = BeautifulSoup(response.text,'lxml')\n",
+ " soup = BeautifulSoup(response.text,'html.parser')\n",
" tables = soup.find_all(\"table\", {\"class\":\"pContent table table-striped table-bordered\"})\n",
" count = 0\n",
" for table in tables:\n",
@@ -1037,31 +925,37 @@
" data.append(dt)\n",
"\n",
"\n",
- "data = data.reverse\n",
+ "data.reverse()\n",
"for i in range(len(data)):\n",
" data[i][\"id\"] = i+1\n",
"\n",
"json_data = json.dumps(data,indent=2)\n",
- "print(json_data)\n",
- "\n",
- "\n",
- "\n",
- "\n"
+ "print(json_data)\n"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
- "\n"
+ "\n",
+ "# save json data to file\n",
+ "with open(\"isro_spacecrafts_scraper_output.json\",\"w\") as f:\n",
+ " f.write(json_data)"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "venv-codex",
"language": "python",
"name": "python3"
},
@@ -1075,7 +969,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.2"
+ "version": "3.11.0"
},
"orig_nbformat": 4
},
diff --git a/package.json b/package.json
index 07d57cb..542625b 100644
--- a/package.json
+++ b/package.json
@@ -6,6 +6,16 @@
"repository": "isro.vercel.app",
"author": "isro",
"license": "MIT",
+ "scripts": {
+ "test": "jest --testPathPattern=tests/",
+ "validate": "node scripts/validate_schemas.js"
+ },
+ "jest": {
+ "testEnvironment": "node"
+ },
"dependencies": {},
- "devDependencies": {}
+ "devDependencies": {
+ "ajv": "^8.17.1",
+ "jest": "^29.7.0"
+ }
}
\ No newline at end of file
diff --git a/schemas/centres.schema.json b/schemas/centres.schema.json
new file mode 100644
index 0000000..6255821
--- /dev/null
+++ b/schemas/centres.schema.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Centres",
+ "type": "object",
+ "required": ["centres"],
+ "additionalProperties": false,
+ "properties": {
+ "centres": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["id", "name"],
+ "additionalProperties": false,
+ "properties": {
+ "id": { "type": "integer", "minimum": 1 },
+ "name": { "type": "string", "minLength": 1 },
+ "place": { "type": ["string", "null"] },
+ "state": { "type": ["string", "null"] }
+ }
+ }
+ }
+ }
+}
diff --git a/schemas/customer_satellites.schema.json b/schemas/customer_satellites.schema.json
new file mode 100644
index 0000000..2aa2975
--- /dev/null
+++ b/schemas/customer_satellites.schema.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Customer Satellites",
+ "type": "object",
+ "required": ["customer_satellites"],
+ "additionalProperties": false,
+ "properties": {
+ "customer_satellites": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["id"],
+ "additionalProperties": false,
+ "properties": {
+ "id": { "type": "integer", "minimum": 1 },
+ "country": { "type": ["string", "null"] },
+ "launch_date": { "type": ["string", "null"], "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
+ "mass_kg": { "type": ["number", "null"], "minimum": 0 },
+ "launcher": { "type": ["string", "null"] }
+ }
+ }
+ }
+ }
+}
diff --git a/schemas/launchers.schema.json b/schemas/launchers.schema.json
new file mode 100644
index 0000000..0dace0a
--- /dev/null
+++ b/schemas/launchers.schema.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Launchers",
+ "type": "object",
+ "required": ["launchers"],
+ "additionalProperties": false,
+ "properties": {
+ "launchers": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["id"],
+ "additionalProperties": false,
+ "properties": {
+ "id": { "type": "integer", "minimum": 1 },
+ "vehicle_family": {
+ "type": ["string", "null"],
+ "enum": ["SLV", "ASLV", "PSLV", "GSLV", "GSLV Mk III", "LVM-3", "RLV", "Scramjet-TD", null]
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/schemas/spacecraft_missions.schema.json b/schemas/spacecraft_missions.schema.json
new file mode 100644
index 0000000..d6681fb
--- /dev/null
+++ b/schemas/spacecraft_missions.schema.json
@@ -0,0 +1,36 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Spacecraft Missions",
+ "type": "object",
+ "required": ["spacecraft_missions"],
+ "additionalProperties": false,
+ "properties": {
+ "spacecraft_missions": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["id", "name", "status"],
+ "additionalProperties": false,
+ "properties": {
+ "id": { "type": "integer", "minimum": 1 },
+ "name": { "type": "string", "minLength": 1 },
+ "mission_type": { "type": ["string", "null"] },
+ "launch_date": { "type": ["string", "null"], "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
+ "launch_site": { "type": ["string", "null"] },
+ "launch_vehicle": { "type": ["string", "null"] },
+ "orbit": { "type": ["string", "null"] },
+ "orbit_type": { "type": ["string", "null"], "enum": ["LEO", "SSO", "GEO", "Lunar", "Interplanetary", "Failed", null] },
+ "altitude_km": { "type": ["number", "null"], "minimum": 0 },
+ "inclination_deg": { "type": ["number", "null"], "minimum": 0, "maximum": 180 },
+ "mass_kg": { "type": ["number", "null"], "minimum": 0 },
+ "power_watts": { "type": ["number", "null"], "minimum": 0 },
+ "mission_life": { "type": ["string", "null"] },
+ "status": { "type": "string", "enum": ["active", "decommissioned", "failed", "unknown"] },
+ "payloads": { "type": ["string", "null"] },
+ "stabilization": { "type": ["string", "null"] },
+ "propulsion": { "type": ["string", "null"] }
+ }
+ }
+ }
+ }
+}
diff --git a/schemas/spacecrafts.schema.json b/schemas/spacecrafts.schema.json
new file mode 100644
index 0000000..8161252
--- /dev/null
+++ b/schemas/spacecrafts.schema.json
@@ -0,0 +1,27 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Spacecrafts",
+ "type": "object",
+ "required": ["spacecrafts"],
+ "additionalProperties": false,
+ "properties": {
+ "spacecrafts": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["id", "name"],
+ "additionalProperties": false,
+ "properties": {
+ "id": { "type": "integer", "minimum": 1 },
+ "name": { "type": "string", "minLength": 1 },
+ "launch_date": { "type": ["string", "null"], "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
+ "launch_vehicle": { "type": ["string", "null"] },
+ "mission_type": { "type": ["string", "null"] },
+ "orbit_type": { "type": ["string", "null"], "enum": ["LEO", "SSO", "GEO", "Lunar", "Interplanetary", "Failed", null] },
+ "mass_kg": { "type": ["number", "null"], "minimum": 0 },
+ "status": { "type": ["string", "null"], "enum": ["active", "decommissioned", "failed", "unknown", null] }
+ }
+ }
+ }
+ }
+}
diff --git a/scripts/normalize_data.py b/scripts/normalize_data.py
new file mode 100644
index 0000000..db5b7af
--- /dev/null
+++ b/scripts/normalize_data.py
@@ -0,0 +1,797 @@
+#!/usr/bin/env python3
+"""
+ISRO API Data Normalization Pipeline
+=====================================
+Cleans, normalizes, and enriches all JSON data files for the ISRO API.
+
+Handles:
+- spacecraft_missions.json: 9+ field name variants for mass, 5+ for power,
+ 15+ date formats, trailing newlines, duplicate entries, inconsistent schemas
+- spacecrafts.json: enriches bare id+name with data from missions
+- launchers.json: enriches bare id with vehicle family classification
+- customer_satellites.json: normalizes country names, dates, mass types
+- centres.json: fixes inconsistent field casing
+
+Run: python scripts/normalize_data.py
+"""
+
+import json
+import re
+import sys
+from pathlib import Path
+from datetime import datetime
+
+# ---------------------------------------------------------------------------
+# Paths
+# ---------------------------------------------------------------------------
+ROOT = Path(__file__).resolve().parent.parent
+DATA_DIR = ROOT / "data"
+
+# ---------------------------------------------------------------------------
+# Date parsing
+# ---------------------------------------------------------------------------
+DATE_FORMATS = [
+ "%Y-%m-%d", # ISO 8601 (idempotent re-runs)
+ "%B %d, %Y", # April 19, 1975
+ "%b %d, %Y", # Jun 07, 1979 / Jul 01, 2013
+ "%B %d,%Y", # June19,1981 (after space insertion)
+ "%b %d,%Y", # Jun 07,1979
+ "%d %B %Y", # 22 October 2008
+ "%d %b %Y", # 22 Oct 2008
+ "%d-%m-%Y", # 26-05-1999
+ "%B %Y", # fallback for month+year only
+]
+
+# Insert space between month name and day if missing: "June19,1981" -> "June 19,1981"
+_DATE_FIX_NOSPACE = re.compile(r'([a-zA-Z])(\d)')
+# Remove ordinal suffixes: "22nd" -> "22", "3rd" -> "3"
+_DATE_FIX_ORDINAL = re.compile(r'(\d+)(st|nd|rd|th)\b')
+
+
+def parse_date(raw):
+ """Parse a date string in any of ISRO's many formats into ISO 8601 (YYYY-MM-DD)."""
+ if not raw or not isinstance(raw, str):
+ return None
+ s = raw.strip()
+ if not s:
+ return None
+ # Fix missing space between month name and digit
+ s = _DATE_FIX_NOSPACE.sub(r'\1 \2', s)
+ # Remove ordinal suffixes
+ s = _DATE_FIX_ORDINAL.sub(r'\1', s)
+ # Normalize non-standard abbreviations: "Sept" -> "Sep"
+ s = re.sub(r'\bSept\b', 'Sep', s)
+ # Normalize multiple spaces
+ s = re.sub(r'\s+', ' ', s).strip()
+
+ for fmt in DATE_FORMATS:
+ try:
+ return datetime.strptime(s, fmt).strftime("%Y-%m-%d")
+ except ValueError:
+ continue
+ # Last resort: try to find a year
+ m = re.search(r'\b((?:19|20)\d{2})\b', s)
+ if m:
+ return m.group(1) # Return just the year
+ return raw.strip() # Return cleaned original if nothing works
+
+
+# ---------------------------------------------------------------------------
+# Numeric extraction helpers
+# ---------------------------------------------------------------------------
+def extract_first_number(s):
+ """Extract the first numeric value from a string like '1380 kg (Mass at lift off)'."""
+ if s is None:
+ return None
+ if isinstance(s, (int, float)):
+ return float(s)
+ s = str(s).strip()
+ if not s:
+ return None
+ # Remove commas in numbers: "2,650" -> "2650"
+ s_clean = s.replace(',', '')
+ m = re.search(r'[\d.]+', s_clean)
+ if m:
+ try:
+ return float(m.group())
+ except ValueError:
+ return None
+ return None
+
+
+def extract_mass_kg(entry):
+ """Extract lift-off mass in kg from any of the 9+ field name variants."""
+ mass_fields = [
+ 'mass_kg', # our normalized field (shouldn't exist yet, but just in case)
+ 'lift-off_weight', 'lift-off_mass', 'mass_at_lift-off', 'mass_at_lift_off',
+ 'off_mass', 'overall_mass', 'spacecraft_mass', 'weight', 'mass',
+ ]
+ for field in mass_fields:
+ val = entry.get(field)
+ if val is not None:
+ num = extract_first_number(val)
+ if num is not None and num > 0:
+ return num
+ return None
+
+
+def extract_power_watts(entry):
+ """Extract power in watts from various field names and formats.
+
+ Handles tricky cases like '15 Sq.m Solar Array generating 1360W' where the
+ first number is the panel area, not the wattage.
+ """
+ power_fields = [
+ 'power_watts', # normalized field name (for idempotent re-runs)
+ 'power', 'onboard_power', 'on_board_power', 'electrical_power',
+ 'onboard_orbit', # known typo for onboard_power
+ 'power_generation',
+ ]
+ for field in power_fields:
+ val = entry.get(field)
+ if val is not None:
+ # Already a number (idempotent re-run)
+ if isinstance(val, (int, float)):
+ return float(val)
+ s = str(val).strip()
+ # "One KW approx" -> 1000
+ if re.match(r'one\s+kw', s, re.IGNORECASE):
+ return 1000.0
+
+ # Look for explicit wattage near "W" or "Watts" or "watt" first.
+ # This avoids extracting solar panel area (e.g. "15 Sq.m") instead
+ # of the actual power number (e.g. "generating 1360W").
+ watt_match = re.search(
+ r'([\d,]+(?:\.\d+)?)\s*(?:watts?|w)\b', s, re.IGNORECASE
+ )
+ if watt_match:
+ num_str = watt_match.group(1).replace(',', '')
+ try:
+ return float(num_str)
+ except ValueError:
+ pass
+
+ # Check if it's in kW
+ kw_match = re.search(
+ r'([\d,]+(?:\.\d+)?)\s*kw\b', s, re.IGNORECASE
+ )
+ if kw_match:
+ num_str = kw_match.group(1).replace(',', '')
+ try:
+ return float(num_str) * 1000
+ except ValueError:
+ pass
+
+ # Fallback: extract first number (for simple cases like "3100")
+ num = extract_first_number(s)
+ if num is not None and num > 0:
+ return num
+ return None
+
+
+def extract_inclination_deg(entry):
+ """Extract inclination as a float from various formats."""
+ inc_fields = ['inclination_deg', # normalized (idempotent)
+ 'inclination', 'mean_inclination', 'orbit_inclination']
+ for field in inc_fields:
+ val = entry.get(field)
+ if val is not None:
+ num = extract_first_number(str(val))
+ if num is not None:
+ return num
+ return None
+
+
+def extract_altitude_km(entry):
+ """Extract altitude in km."""
+ alt_fields = ['altitude_km', # normalized field name (idempotent)
+ 'altitude', 'mean_altitude', 'orbit_altitude', 'orbit_height',
+ 'orbit_altitude_at_injection']
+ # Handle mangled field name from fresh scraper output
+ for key in list(entry.keys()):
+ if 'altitude' in key.lower() and key not in alt_fields and '_' * 5 in key:
+ alt_fields.append(key)
+ for field in alt_fields:
+ val = entry.get(field)
+ if val is not None:
+ num = extract_first_number(str(val))
+ if num is not None:
+ return num
+ return None
+
+
+# ---------------------------------------------------------------------------
+# Mission-specific extractors
+# ---------------------------------------------------------------------------
+def extract_field(entry, field_names):
+ """Return the first non-empty value from a list of possible field names."""
+ for f in field_names:
+ val = entry.get(f)
+ if val is not None:
+ s = str(val).strip().replace('\n', ' ')
+ s = re.sub(r'\s+', ' ', s)
+ if s:
+ return s
+ return None
+
+
+def clean_name(name):
+ """Clean a spacecraft/mission name: strip whitespace, newlines, normalize dashes."""
+ if not name:
+ return name
+ s = name.strip().replace('\n', ' ')
+ s = re.sub(r'\s+', ' ', s)
+ # Normalize various dash types to standard hyphen
+ s = s.replace('\u2013', '-').replace('\u2014', '-') # en-dash, em-dash
+ # Fix "CARTOSAT - 2A" -> "CARTOSAT-2A" (remove spaces around hyphens between word and number)
+ s = re.sub(r'\s*-\s*', '-', s)
+ return s
+
+
+def extract_mission_type(entry):
+ """Extract mission type/purpose, avoiding mis-stored mission_life values."""
+ # Check normalized field first (idempotent re-run)
+ val = entry.get('mission_type') or entry.get('mission')
+ if val is None:
+ return None
+ s = str(val).strip()
+ # These are mission_life values incorrectly stored in 'mission'
+ if re.match(r'^[\d>~]+\s*(years?|months?|days?)', s, re.IGNORECASE):
+ return None
+ if s.lower() in ('very long',):
+ return None
+ return s
+
+
+def extract_mission_life(entry):
+ """Extract mission life from various field names, including mis-stored 'mission' field."""
+ # First check dedicated mission_life fields
+ life_fields = ['mission_life', 'nominal_mission_life', 'life']
+ for f in life_fields:
+ val = entry.get(f)
+ if val is not None:
+ s = str(val).strip()
+ if s:
+ return normalize_mission_life(s)
+
+ # Check if 'mission' field actually contains mission life
+ val = entry.get('mission')
+ if val is not None:
+ s = str(val).strip()
+ if re.match(r'^[\d>~]+\s*(years?|months?|days?)', s, re.IGNORECASE):
+ return normalize_mission_life(s)
+ if s.lower() in ('very long',):
+ return s
+
+ return None
+
+
+def normalize_mission_life(s):
+ """Normalize mission life strings to consistent format."""
+ s = s.strip()
+ # Remove parenthetical details like "(nominal)" or "(Re-entered on ...)"
+ # but keep the core info
+ core = re.split(r'\s*\(', s)[0].strip()
+ if not core:
+ core = s
+ # "Seven years" -> "7 years", etc.
+ word_to_num = {
+ 'one': '1', 'two': '2', 'three': '3', 'four': '4', 'five': '5',
+ 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9', 'ten': '10',
+ 'twelve': '12', 'fifteen': '15', 'seventeen': '17', 'twenty': '20',
+ }
+ lower = core.lower()
+ for word, num in word_to_num.items():
+ if lower.startswith(word):
+ core = num + core[len(word):]
+ break
+ # Normalize "Years" -> "years", "Months" -> "months"
+ core = re.sub(r'\b(Years?|Months?|Days?)\b', lambda m: m.group().lower(), core)
+ # "More Than 12 years" -> ">12 years"
+ core = re.sub(r'^more\s+than\s+', '>', core, flags=re.IGNORECASE)
+ # "About 8 years" -> "~8 years"
+ core = re.sub(r'^about\s+', '~', core, flags=re.IGNORECASE)
+ return core
+
+
+def classify_orbit_type(entry):
+ """Classify orbit type from orbit description."""
+ # Preserve existing classification on re-runs (idempotent)
+ existing = entry.get('orbit_type')
+ if existing and existing in ('LEO', 'SSO', 'GEO', 'GTO', 'Lunar', 'Interplanetary', 'Polar', 'Failed'):
+ return existing
+
+ orbit = str(entry.get('orbit', '')).lower()
+ name = str(entry.get('name', '')).lower()
+
+ if 'not realised' in orbit or 'not achieved' in orbit:
+ return "Failed"
+ if 'lunar' in orbit or 'chandrayaan' in name or 'moon' in orbit:
+ return "Lunar"
+ if 'mars' in name or 'mars' in orbit:
+ return "Interplanetary"
+ if 'geostationary' in orbit or 'geosynchronous' in orbit or 'geo stationary' in orbit:
+ return "GEO"
+ if 'sun synchronous' in orbit or 'sun-synchronous' in orbit or 'polar sun' in orbit:
+ return "SSO"
+ if 'polar' in orbit:
+ return "Polar"
+ # Check altitude for LEO classification
+ alt = extract_altitude_km(entry)
+ if alt and alt < 2000:
+ return "LEO"
+ return None
+
+
+def extract_stabilization(entry):
+ """Extract stabilization info from various misspelled field names."""
+ fields = ['stabilization', 'stabilisation', 'satbilisation',
+ 'attitude_and_orbit_control', 'attitude_and_orbit_control_system_(aocs)',
+ 'attitude_orbit_control', 'attitude_and_orbit_control_system',
+ 'aocs', 'control_system']
+ return extract_field(entry, fields)
+
+
+def extract_propulsion(entry):
+ """Extract propulsion info."""
+ fields = ['propulsion', 'propulsion_system', 'rcs']
+ return extract_field(entry, fields)
+
+
+# ---------------------------------------------------------------------------
+# Status inference
+# ---------------------------------------------------------------------------
+def infer_status(entry):
+ """Infer whether a mission is active, decommissioned, or failed."""
+ # Preserve already-inferred status on re-runs (idempotent)
+ existing = entry.get('status')
+ if existing and existing in ('active', 'decommissioned', 'failed'):
+ return existing
+
+ orbit = str(entry.get('orbit', '')).lower()
+ if 'not realised' in orbit or 'not achieved' in orbit:
+ return "failed"
+
+ # Check for mission_completed_on or mission_completed_during fields
+ for f in ['mission_completed_on', 'mission_completed_during']:
+ if entry.get(f):
+ return "decommissioned"
+
+ # Check mission_life and orbital_life for re-entry info
+ for f in ['mission_life', 'orbital_life', 'orbit_life']:
+ val = str(entry.get(f, '')).lower()
+ if 're-entered' in val or 're-entry' in val:
+ return "decommissioned"
+
+ # Estimate from launch date and mission life
+ launch_str = extract_field(entry, ['launch_date', 'date'])
+ if launch_str:
+ date_iso = parse_date(launch_str)
+ if date_iso and len(date_iso) == 10:
+ try:
+ launch_dt = datetime.strptime(date_iso, "%Y-%m-%d")
+ life_str = extract_mission_life(entry)
+ if life_str:
+ years_match = re.search(r'(\d+)\s*years?', str(life_str), re.IGNORECASE)
+ months_match = re.search(r'(\d+)\s*months?', str(life_str), re.IGNORECASE)
+ total_years = 0
+ if years_match:
+ total_years = int(years_match.group(1))
+ elif months_match:
+ total_years = int(months_match.group(1)) / 12
+ if total_years > 0:
+ from datetime import timedelta
+ end_dt = launch_dt + timedelta(days=total_years * 365.25)
+ if end_dt < datetime(2026, 1, 1):
+ return "decommissioned"
+ else:
+ return "active"
+ # Very old missions without explicit life info
+ if launch_dt.year < 2000:
+ return "decommissioned"
+ except (ValueError, TypeError):
+ pass
+
+ return "unknown"
+
+
+# ---------------------------------------------------------------------------
+# Normalize spacecraft_missions.json
+# ---------------------------------------------------------------------------
+DUPLICATE_MISSION_IDS = {
+ # TES appears twice (id 28 "PSLV-C3 / TES" and id 29 "The Technology Experiment Satellite (TES)")
+ # Keep id 29 which has the proper name; drop id 28 which is launcher/spacecraft hybrid name
+ 28,
+}
+
+# Names to exclude (normalized lowercase) -- catches duplicates across data sources
+DUPLICATE_MISSION_NAMES = {
+ "pslv-c3 / tes",
+ "pslv-c3/tes",
+}
+
+
+SCRAPER_OUTPUT = ROOT / "isro_scrape" / "isro_spacecrafts_scraper_output.json"
+
+
+def _normalize_entry(entry):
+ """Normalize a single mission entry into the canonical schema."""
+ name = clean_name(entry.get('name', ''))
+ launch_date = parse_date(extract_field(entry, ['launch_date', 'date']))
+ mission_type = extract_mission_type(entry)
+ orbit_type = classify_orbit_type(entry)
+ status = infer_status(entry)
+
+ return {
+ "id": entry.get('id'),
+ "name": name,
+ "mission_type": mission_type,
+ "launch_date": launch_date,
+ "launch_site": extract_field(entry, ['launch_site']),
+ "launch_vehicle": extract_field(entry, ['launch_vehicle']),
+ "orbit": extract_field(entry, ['orbit']),
+ "orbit_type": orbit_type,
+ "altitude_km": extract_altitude_km(entry),
+ "inclination_deg": extract_inclination_deg(entry),
+ "mass_kg": extract_mass_kg(entry),
+ "power_watts": extract_power_watts(entry),
+ "mission_life": extract_mission_life(entry),
+ "status": status,
+ "payloads": extract_field(entry, ['payloads', 'payload', 'communication_payloads']),
+ "stabilization": extract_stabilization(entry),
+ "propulsion": extract_propulsion(entry),
+ }
+
+
+def _merge_records(old, new):
+ """Merge two normalized records, preferring non-null values from `new`."""
+ merged = dict(old)
+ for key, val in new.items():
+ if val is not None:
+ merged[key] = val
+ return merged
+
+
+def normalize_missions():
+ """Normalize spacecraft_missions.json into a consistent schema.
+
+ If a fresh scraper output exists at isro_scrape/isro_spacecrafts_scraper_output.json,
+ merges it with the existing data -- fresh scraper data takes priority for non-null
+ fields, but existing entries not in the scraper output are preserved.
+ """
+ with open(DATA_DIR / "spacecraft_missions.json", "r", encoding="utf-8") as f:
+ raw = json.load(f)
+
+ # Raw file is a plain array (not wrapped in object)
+ if isinstance(raw, list):
+ entries = raw
+ else:
+ entries = raw.get("spacecraft_missions", raw)
+
+ # Build lookup by cleaned name from existing data
+ by_name = {}
+ for entry in entries:
+ eid = entry.get('id')
+ if eid in DUPLICATE_MISSION_IDS:
+ continue
+ record = _normalize_entry(entry)
+ if record['name']:
+ key = record['name'].lower()
+ if key in DUPLICATE_MISSION_NAMES:
+ continue
+ by_name[key] = record
+
+ # Merge with fresh scraper output if available
+ if SCRAPER_OUTPUT.exists():
+ print(f" Merging with fresh scraper output: {SCRAPER_OUTPUT.name}")
+ with open(SCRAPER_OUTPUT, "r", encoding="utf-8") as f:
+ scraper_data = json.load(f)
+ merged_count = 0
+ for entry in scraper_data:
+ record = _normalize_entry(entry)
+ if record['name']:
+ key = record['name'].lower()
+ if key in DUPLICATE_MISSION_NAMES:
+ continue
+ if key in by_name:
+ by_name[key] = _merge_records(by_name[key], record)
+ else:
+ by_name[key] = record
+ merged_count += 1
+ print(f" Merged {merged_count} records from scraper output")
+
+ normalized = list(by_name.values())
+
+ # Re-assign sequential IDs (oldest first, by launch date)
+ def sort_key(r):
+ d = r.get('launch_date') or '9999'
+ return d
+ normalized.sort(key=sort_key)
+ for i, record in enumerate(normalized, start=1):
+ record['id'] = i
+
+ return {"spacecraft_missions": normalized}
+
+
+# ---------------------------------------------------------------------------
+# Normalize & enrich spacecrafts.json
+# ---------------------------------------------------------------------------
+def build_missions_lookup(missions_data):
+ """Build a lookup dict from cleaned mission name -> mission record."""
+ lookup = {}
+ for m in missions_data["spacecraft_missions"]:
+ name = m["name"]
+ if name:
+ # Store under exact cleaned name
+ lookup[name.lower()] = m
+ # Also store under simplified name (remove series suffixes etc.)
+ simple = re.sub(r'\s*series\s*satellite\b', '', name, flags=re.IGNORECASE).strip()
+ if simple.lower() != name.lower():
+ lookup[simple.lower()] = m
+ return lookup
+
+
+def normalize_spacecrafts(missions_data):
+ """Enrich spacecrafts.json with data from missions."""
+ with open(DATA_DIR / "spacecrafts.json", "r", encoding="utf-8") as f:
+ raw = json.load(f)
+
+ spacecrafts = raw.get("spacecrafts", raw)
+ lookup = build_missions_lookup(missions_data)
+
+ enriched = []
+ for sc in spacecrafts:
+ name = clean_name(sc.get('name', ''))
+ name_lower = name.lower() if name else ''
+
+ # Try to find matching mission
+ mission = lookup.get(name_lower)
+
+ # Try alternative lookups if exact match fails
+ if not mission and name_lower:
+ # Try without trailing numbers for series satellites
+ for key, val in lookup.items():
+ if name_lower in key or key in name_lower:
+ mission = val
+ break
+
+ record = {
+ "id": sc["id"],
+ "name": name,
+ }
+
+ if mission:
+ record["launch_date"] = mission.get("launch_date")
+ record["launch_vehicle"] = mission.get("launch_vehicle")
+ record["mission_type"] = mission.get("mission_type")
+ record["orbit_type"] = mission.get("orbit_type")
+ record["mass_kg"] = mission.get("mass_kg")
+ record["status"] = mission.get("status")
+ else:
+ record["launch_date"] = None
+ record["launch_vehicle"] = None
+ record["mission_type"] = None
+ record["orbit_type"] = None
+ record["mass_kg"] = None
+ record["status"] = None
+
+ enriched.append(record)
+
+ return {"spacecrafts": enriched}
+
+
+# ---------------------------------------------------------------------------
+# Normalize & enrich launchers.json
+# ---------------------------------------------------------------------------
+LAUNCHER_FAMILIES = {
+ 'SLV': 'SLV',
+ 'ASLV': 'ASLV',
+ 'PSLV': 'PSLV',
+ 'GSLV Mk III': 'GSLV Mk III',
+ 'GSLV-Mk III': 'GSLV Mk III',
+ 'LVM': 'LVM-3',
+ 'GSLV': 'GSLV',
+ 'RLV': 'RLV',
+ 'Scramjet': 'Scramjet-TD',
+}
+
+
+def classify_launcher_family(launcher_id):
+ """Classify a launcher into its vehicle family."""
+ lid = str(launcher_id).strip()
+ # Check longest prefixes first to avoid GSLV matching before GSLV Mk III
+ for prefix in sorted(LAUNCHER_FAMILIES.keys(), key=len, reverse=True):
+ if lid.startswith(prefix):
+ return LAUNCHER_FAMILIES[prefix]
+ return "Unknown"
+
+
+def normalize_launchers(customer_sats_data):
+ """Enrich launchers.json with vehicle family and customer satellite stats."""
+ with open(DATA_DIR / "launchers.json", "r", encoding="utf-8") as f:
+ raw = json.load(f)
+
+ launchers = raw.get("launchers", raw)
+
+ # Build a map of launcher -> customer satellites launched
+ cust_by_launcher = {}
+ for sat in customer_sats_data.get("customer_satellites", []):
+ lid = sat.get("launcher", "")
+ if lid not in cust_by_launcher:
+ cust_by_launcher[lid] = []
+ cust_by_launcher[lid].append(sat.get("id", ""))
+
+ enriched = []
+ for launcher in launchers:
+ lid = launcher["id"]
+ family = classify_launcher_family(lid)
+ cust_sats = cust_by_launcher.get(lid, [])
+
+ record = {
+ "id": lid,
+ "vehicle_family": family,
+ }
+ if cust_sats:
+ record["customer_satellites_launched"] = cust_sats
+
+ enriched.append(record)
+
+ return {"launchers": enriched}
+
+
+# ---------------------------------------------------------------------------
+# Normalize customer_satellites.json
+# ---------------------------------------------------------------------------
+COUNTRY_NORMALIZE = {
+ "REPUBLIC OF KOREA": "South Korea",
+ "GERMANY": "Germany",
+ "BELGIUM": "Belgium",
+ "INDONESIA": "Indonesia",
+ "ARGENTINA": "Argentina",
+ "ITALY": "Italy",
+ "ISRAEL": "Israel",
+ "CANADA": "Canada",
+ "JAPAN": "Japan",
+ "THE NETHERLANDS": "Netherlands",
+ "DENMARK": "Denmark",
+ "TURKEY": "Turkey",
+ "SWITZERLAND": "Switzerland",
+ "ALGERIA": "Algeria",
+ "NORWAY": "Norway",
+ "SINGAPORE": "Singapore",
+ "LUXEMBOURG": "Luxembourg",
+ "FRANCE": "France",
+ "UNITED KINGDOM": "United Kingdom",
+ "UK": "United Kingdom",
+ "USA": "United States",
+ "BRAZIL": "Brazil",
+ "Germany": "Germany",
+}
+
+
+def normalize_customer_satellites():
+ """Clean customer_satellites.json: dates, mass, country names."""
+ with open(DATA_DIR / "customer_satellites.json", "r", encoding="utf-8") as f:
+ raw = json.load(f)
+
+ satellites = raw.get("customer_satellites", raw)
+ cleaned = []
+
+ for sat in satellites:
+ country_raw = sat.get("country", "").strip()
+ country = COUNTRY_NORMALIZE.get(country_raw, country_raw.title())
+
+ # Support both original 'mass' field and normalized 'mass_kg' (idempotent)
+ mass_raw = sat.get("mass_kg", sat.get("mass", ""))
+ if isinstance(mass_raw, (int, float)):
+ mass_kg = float(mass_raw) if mass_raw else None
+ else:
+ mass_kg = extract_first_number(mass_raw) if mass_raw else None
+
+ launch_date = parse_date(sat.get("launch_date", ""))
+
+ record = {
+ "id": sat["id"],
+ "country": country,
+ "launch_date": launch_date,
+ "mass_kg": mass_kg,
+ "launcher": sat.get("launcher", ""),
+ }
+ cleaned.append(record)
+
+ return {"customer_satellites": cleaned}
+
+
+# ---------------------------------------------------------------------------
+# Normalize centres.json
+# ---------------------------------------------------------------------------
+def normalize_centres():
+ """Fix field casing in centres.json."""
+ with open(DATA_DIR / "centres.json", "r", encoding="utf-8") as f:
+ raw = json.load(f)
+
+ centres = raw.get("centres", raw)
+ cleaned = []
+
+ for centre in centres:
+ record = {
+ "id": centre["id"],
+ "name": centre["name"],
+ "place": centre.get("Place", centre.get("place", "")),
+ "state": centre.get("State", centre.get("state", "")),
+ }
+ cleaned.append(record)
+
+ return {"centres": cleaned}
+
+
+# ---------------------------------------------------------------------------
+# Main
+# ---------------------------------------------------------------------------
+def write_json(data, filename):
+ """Write data to a JSON file with consistent formatting."""
+ path = DATA_DIR / filename
+ with open(path, "w", encoding="utf-8") as f:
+ json.dump(data, f, indent=2, ensure_ascii=False)
+ count = len(list(data.values())[0]) if data else 0
+ print(f" {filename}: {count} records written")
+
+
+def main():
+ print("ISRO API Data Normalization Pipeline")
+ print("=" * 50)
+
+ print("\n[1/5] Normalizing spacecraft_missions.json...")
+ missions = normalize_missions()
+ write_json(missions, "spacecraft_missions.json")
+
+ print("\n[2/5] Normalizing & enriching spacecrafts.json...")
+ spacecrafts = normalize_spacecrafts(missions)
+ write_json(spacecrafts, "spacecrafts.json")
+
+ print("\n[3/5] Normalizing customer_satellites.json...")
+ cust_sats = normalize_customer_satellites()
+ write_json(cust_sats, "customer_satellites.json")
+
+ print("\n[4/5] Normalizing & enriching launchers.json...")
+ launchers = normalize_launchers(cust_sats)
+ write_json(launchers, "launchers.json")
+
+ print("\n[5/5] Normalizing centres.json...")
+ centres = normalize_centres()
+ write_json(centres, "centres.json")
+
+ # Print summary stats
+ print("\n" + "=" * 50)
+ print("SUMMARY")
+ print("=" * 50)
+ m = missions["spacecraft_missions"]
+ print(f" Missions: {len(m)} records")
+ print(f" - With launch_date: {sum(1 for r in m if r['launch_date'])}")
+ print(f" - With mass_kg: {sum(1 for r in m if r['mass_kg'])}")
+ print(f" - With power_watts: {sum(1 for r in m if r['power_watts'])}")
+ print(f" - With orbit_type: {sum(1 for r in m if r['orbit_type'])}")
+ print(f" - Status active: {sum(1 for r in m if r['status'] == 'active')}")
+ print(f" - Status decommissioned: {sum(1 for r in m if r['status'] == 'decommissioned')}")
+ print(f" - Status failed: {sum(1 for r in m if r['status'] == 'failed')}")
+
+ sc = spacecrafts["spacecrafts"]
+ enriched = sum(1 for r in sc if r.get('launch_date'))
+ print(f"\n Spacecrafts: {len(sc)} records ({enriched} enriched from missions)")
+
+ cs = cust_sats["customer_satellites"]
+ countries = set(r['country'] for r in cs)
+ print(f"\n Customer Satellites: {len(cs)} records from {len(countries)} countries")
+
+ la = launchers["launchers"]
+ families = set(r['vehicle_family'] for r in la)
+ print(f"\n Launchers: {len(la)} records across {len(families)} families: {sorted(families)}")
+
+ ce = centres["centres"]
+ print(f"\n Centres: {len(ce)} records")
+
+ print("\nDone! All files written to data/")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/validate_schemas.js b/scripts/validate_schemas.js
new file mode 100644
index 0000000..54aeb18
--- /dev/null
+++ b/scripts/validate_schemas.js
@@ -0,0 +1,42 @@
+#!/usr/bin/env node
+/**
+ * Validates all data files against their JSON Schemas.
+ * Run: node scripts/validate_schemas.js
+ * Exit code 0 = all valid, 1 = validation errors found.
+ */
+
+const Ajv = require("ajv");
+const path = require("path");
+const fs = require("fs");
+
+const ajv = new Ajv({ allErrors: true });
+
+const FILES = [
+ { data: "data/spacecrafts.json", schema: "schemas/spacecrafts.schema.json" },
+ { data: "data/launchers.json", schema: "schemas/launchers.schema.json" },
+ { data: "data/customer_satellites.json", schema: "schemas/customer_satellites.schema.json" },
+ { data: "data/centres.json", schema: "schemas/centres.schema.json" },
+ { data: "data/spacecraft_missions.json", schema: "schemas/spacecraft_missions.schema.json" },
+];
+
+const root = path.resolve(__dirname, "..");
+let allValid = true;
+
+for (const { data: dataFile, schema: schemaFile } of FILES) {
+ const data = JSON.parse(fs.readFileSync(path.join(root, dataFile), "utf8"));
+ const schema = JSON.parse(fs.readFileSync(path.join(root, schemaFile), "utf8"));
+ const validate = ajv.compile(schema);
+ const valid = validate(data);
+
+ if (valid) {
+ console.log(`✓ ${dataFile}`);
+ } else {
+ console.error(`✗ ${dataFile}`);
+ for (const err of validate.errors) {
+ console.error(` ${err.instancePath || "(root)"} ${err.message}`);
+ }
+ allValid = false;
+ }
+}
+
+process.exit(allValid ? 0 : 1);
diff --git a/tests/api/centres.test.js b/tests/api/centres.test.js
new file mode 100644
index 0000000..ac000c6
--- /dev/null
+++ b/tests/api/centres.test.js
@@ -0,0 +1,41 @@
+const handler = require("../../api/centres");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+describe("GET /api/centres", () => {
+ test("returns 200 with application/json header", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._status).toBe(200);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("response has centres wrapper key with 44 records", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._body).toHaveProperty("centres");
+ expect(res._body.centres).toHaveLength(44);
+ });
+
+ test("each record has consistent lowercase field names", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.centres) {
+ expect(r).not.toHaveProperty("Place");
+ expect(r).not.toHaveProperty("State");
+ expect(r).toHaveProperty("id");
+ expect(r).toHaveProperty("name");
+ }
+ });
+
+ test("filters by state (case-insensitive)", async () => {
+ const res1 = mockRes();
+ await handler(mockReq({ state: "Karnataka" }), res1);
+ const res2 = mockRes();
+ await handler(mockReq({ state: "karnataka" }), res2);
+ expect(res1._body.centres.length).toBeGreaterThan(0);
+ expect(res1._body.centres).toEqual(res2._body.centres);
+ for (const r of res1._body.centres) {
+ expect(r.state.toLowerCase()).toBe("karnataka");
+ }
+ });
+});
diff --git a/tests/api/customer_satellites.test.js b/tests/api/customer_satellites.test.js
new file mode 100644
index 0000000..c0ab7de
--- /dev/null
+++ b/tests/api/customer_satellites.test.js
@@ -0,0 +1,58 @@
+const handler = require("../../api/customer_satellites");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
+
+describe("GET /api/customer_satellites", () => {
+ test("returns 200 with application/json header", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._status).toBe(200);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("response has customer_satellites wrapper key with 75 records", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._body).toHaveProperty("customer_satellites");
+ expect(res._body.customer_satellites).toHaveLength(75);
+ });
+
+ test("all non-null launch_dates are ISO 8601 format", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.customer_satellites) {
+ if (r.launch_date !== null) {
+ expect(r.launch_date).toMatch(ISO_DATE);
+ }
+ }
+ });
+
+ test("all non-null mass_kg values are positive numbers", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.customer_satellites) {
+ if (r.mass_kg !== null) {
+ expect(typeof r.mass_kg).toBe("number");
+ expect(r.mass_kg).toBeGreaterThan(0);
+ }
+ }
+ });
+
+ test("filters by country", async () => {
+ const res = mockRes();
+ await handler(mockReq({ country: "Germany" }), res);
+ expect(res._body.customer_satellites.length).toBeGreaterThan(0);
+ for (const r of res._body.customer_satellites) {
+ expect(r.country.toLowerCase()).toBe("germany");
+ }
+ });
+
+ test("country filter is case-insensitive", async () => {
+ const res1 = mockRes();
+ await handler(mockReq({ country: "germany" }), res1);
+ const res2 = mockRes();
+ await handler(mockReq({ country: "GERMANY" }), res2);
+ expect(res1._body.customer_satellites).toEqual(res2._body.customer_satellites);
+ });
+});
diff --git a/tests/api/launchers.test.js b/tests/api/launchers.test.js
new file mode 100644
index 0000000..17ddb1f
--- /dev/null
+++ b/tests/api/launchers.test.js
@@ -0,0 +1,47 @@
+const handler = require("../../api/launchers");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+describe("GET /api/launchers", () => {
+ test("returns 200 with application/json header", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._status).toBe(200);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("response has launchers wrapper key with array of 81 records", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._body).toHaveProperty("launchers");
+ expect(res._body.launchers).toHaveLength(81);
+ });
+
+ test("each record has an integer id", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const record of res._body.launchers) {
+ expect(Number.isInteger(record.id)).toBe(true);
+ }
+ });
+
+ test("filters by vehicle_family (case-insensitive)", async () => {
+ const res1 = mockRes();
+ await handler(mockReq({ vehicle_family: "PSLV" }), res1);
+ const res2 = mockRes();
+ await handler(mockReq({ vehicle_family: "pslv" }), res2);
+ expect(res1._body.launchers.length).toBeGreaterThan(0);
+ expect(res1._body.launchers).toEqual(res2._body.launchers);
+ for (const r of res1._body.launchers) {
+ expect(r.vehicle_family).toBe("PSLV");
+ }
+ });
+
+ test("known vehicle families are present in data", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ const families = new Set(res._body.launchers.map((r) => r.vehicle_family));
+ for (const f of ["PSLV", "GSLV", "SLV", "ASLV"]) {
+ expect(families.has(f)).toBe(true);
+ }
+ });
+});
diff --git a/tests/api/spacecraft_missions-id.test.js b/tests/api/spacecraft_missions-id.test.js
new file mode 100644
index 0000000..2741778
--- /dev/null
+++ b/tests/api/spacecraft_missions-id.test.js
@@ -0,0 +1,53 @@
+const handler = require("../../api/spacecraft_missions/[id]");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+describe("GET /api/spacecraft_missions/:id", () => {
+ test("returns the correct record for a valid ID", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ expect(res._status).toBe(200);
+ expect(res._body.id).toBe(1);
+ expect(typeof res._body.name).toBe("string");
+ });
+
+ test("returns 200 with application/json header", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("returns 404 for non-existent ID", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "99999" }), res);
+ expect(res._status).toBe(404);
+ expect(res._body).toHaveProperty("error");
+ });
+
+ test("returns 400 for non-integer ID", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "abc" }), res);
+ expect(res._status).toBe(400);
+ expect(res._body).toHaveProperty("error");
+ });
+
+ test("record includes _links.self and _links.spacecraft", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ expect(res._body._links).toHaveProperty("self", "/api/spacecraft_missions/1");
+ expect(res._body._links).toHaveProperty("spacecraft");
+ expect(res._body._links.spacecraft).toMatch(/^\/api\/spacecrafts\/\d+$/);
+ });
+
+ test("record has the full 17-field normalized schema", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ const EXPECTED_FIELDS = [
+ "id", "name", "mission_type", "launch_date", "launch_site", "launch_vehicle",
+ "orbit", "orbit_type", "altitude_km", "inclination_deg", "mass_kg", "power_watts",
+ "mission_life", "status", "payloads", "stabilization", "propulsion",
+ ];
+ for (const field of EXPECTED_FIELDS) {
+ expect(res._body).toHaveProperty(field);
+ }
+ });
+});
diff --git a/tests/api/spacecraft_missions.test.js b/tests/api/spacecraft_missions.test.js
new file mode 100644
index 0000000..38d3fcf
--- /dev/null
+++ b/tests/api/spacecraft_missions.test.js
@@ -0,0 +1,99 @@
+const handler = require("../../api/spacecraft_missions");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
+const VALID_STATUSES = new Set(["active", "decommissioned", "failed", "unknown"]);
+const VALID_ORBIT_TYPES = new Set(["LEO", "SSO", "GEO", "Lunar", "Interplanetary", "Failed"]);
+
+describe("GET /api/spacecraft_missions", () => {
+ test("returns 200 with application/json header", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._status).toBe(200);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("response has spacecraft_missions wrapper key with 64 records", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._body).toHaveProperty("spacecraft_missions");
+ expect(res._body.spacecraft_missions).toHaveLength(64);
+ });
+
+ test("all records have valid status values", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.spacecraft_missions) {
+ expect(VALID_STATUSES.has(r.status)).toBe(true);
+ }
+ });
+
+ test("all non-null orbit_type values are from known set", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.spacecraft_missions) {
+ if (r.orbit_type !== null) {
+ expect(VALID_ORBIT_TYPES.has(r.orbit_type)).toBe(true);
+ }
+ }
+ });
+
+ test("all non-null launch_dates are ISO 8601 format", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.spacecraft_missions) {
+ if (r.launch_date !== null) {
+ expect(r.launch_date).toMatch(ISO_DATE);
+ }
+ }
+ });
+
+ test("all non-null mass_kg values are positive numbers", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.spacecraft_missions) {
+ if (r.mass_kg !== null) {
+ expect(typeof r.mass_kg).toBe("number");
+ expect(r.mass_kg).toBeGreaterThan(0);
+ }
+ }
+ });
+
+ test("all non-null power_watts values are positive numbers", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ for (const r of res._body.spacecraft_missions) {
+ if (r.power_watts !== null) {
+ expect(typeof r.power_watts).toBe("number");
+ expect(r.power_watts).toBeGreaterThan(0);
+ }
+ }
+ });
+
+ test("filters by status", async () => {
+ const res = mockRes();
+ await handler(mockReq({ status: "active" }), res);
+ expect(res._body.spacecraft_missions.length).toBeGreaterThan(0);
+ for (const r of res._body.spacecraft_missions) {
+ expect(r.status).toBe("active");
+ }
+ });
+
+ test("filters by orbit_type", async () => {
+ const res = mockRes();
+ await handler(mockReq({ orbit_type: "SSO" }), res);
+ expect(res._body.spacecraft_missions.length).toBeGreaterThan(0);
+ for (const r of res._body.spacecraft_missions) {
+ expect(r.orbit_type).toBe("SSO");
+ }
+ });
+
+ test("combined filters return intersection", async () => {
+ const res = mockRes();
+ await handler(mockReq({ orbit_type: "GEO", status: "decommissioned" }), res);
+ for (const r of res._body.spacecraft_missions) {
+ expect(r.orbit_type).toBe("GEO");
+ expect(r.status).toBe("decommissioned");
+ }
+ });
+});
diff --git a/tests/api/spacecrafts-id.test.js b/tests/api/spacecrafts-id.test.js
new file mode 100644
index 0000000..73b0f6c
--- /dev/null
+++ b/tests/api/spacecrafts-id.test.js
@@ -0,0 +1,46 @@
+const handler = require("../../api/spacecrafts/[id]");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+describe("GET /api/spacecrafts/:id", () => {
+ test("returns the correct record for a valid ID", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ expect(res._status).toBe(200);
+ expect(res._body.id).toBe(1);
+ expect(res._body.name).toBe("Aryabhata");
+ });
+
+ test("returns 200 with application/json header", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("returns 404 for non-existent ID", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "99999" }), res);
+ expect(res._status).toBe(404);
+ expect(res._body).toHaveProperty("error");
+ });
+
+ test("returns 400 for non-integer ID", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "abc" }), res);
+ expect(res._status).toBe(400);
+ expect(res._body).toHaveProperty("error");
+ });
+
+ test("record includes _links.self", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ expect(res._body._links).toHaveProperty("self", "/api/spacecrafts/1");
+ });
+
+ test("record includes _links.mission when a matching mission exists", async () => {
+ const res = mockRes();
+ await handler(mockReq({ id: "1" }), res);
+ // Aryabhata has a mission record
+ expect(res._body._links).toHaveProperty("mission");
+ expect(res._body._links.mission).toMatch(/^\/api\/spacecraft_missions\/\d+$/);
+ });
+});
diff --git a/tests/api/spacecrafts.test.js b/tests/api/spacecrafts.test.js
new file mode 100644
index 0000000..091ce00
--- /dev/null
+++ b/tests/api/spacecrafts.test.js
@@ -0,0 +1,85 @@
+const handler = require("../../api/spacecrafts");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+describe("GET /api/spacecrafts", () => {
+ test("returns 200 with application/json header", async () => {
+ const req = mockReq();
+ const res = mockRes();
+ await handler(req, res);
+ expect(res._status).toBe(200);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("response has spacecrafts wrapper key with array", async () => {
+ const req = mockReq();
+ const res = mockRes();
+ await handler(req, res);
+ expect(res._body).toHaveProperty("spacecrafts");
+ expect(Array.isArray(res._body.spacecrafts)).toBe(true);
+ });
+
+ test("returns all 113 spacecrafts when no filters", async () => {
+ const req = mockReq();
+ const res = mockRes();
+ await handler(req, res);
+ expect(res._body.spacecrafts).toHaveLength(113);
+ });
+
+ test("each record has required id and name fields", async () => {
+ const req = mockReq();
+ const res = mockRes();
+ await handler(req, res);
+ for (const record of res._body.spacecrafts) {
+ expect(typeof record.id).toBe("number");
+ expect(typeof record.name).toBe("string");
+ expect(record.name.length).toBeGreaterThan(0);
+ }
+ });
+
+ test("filters by status (case-insensitive)", async () => {
+ const res1 = mockRes();
+ await handler(mockReq({ status: "active" }), res1);
+ const res2 = mockRes();
+ await handler(mockReq({ status: "ACTIVE" }), res2);
+ expect(res1._body.spacecrafts.length).toBeGreaterThan(0);
+ expect(res1._body.spacecrafts).toEqual(res2._body.spacecrafts);
+ for (const r of res1._body.spacecrafts) {
+ expect(r.status).toBe("active");
+ }
+ });
+
+ test("filters by orbit_type", async () => {
+ const res = mockRes();
+ await handler(mockReq({ orbit_type: "GEO" }), res);
+ expect(res._body.spacecrafts.length).toBeGreaterThan(0);
+ for (const r of res._body.spacecrafts) {
+ expect(r.orbit_type).toBe("GEO");
+ }
+ });
+
+ test("multiple filters narrow results (AND logic)", async () => {
+ const resAll = mockRes();
+ await handler(mockReq({ orbit_type: "GEO" }), resAll);
+
+ const resBoth = mockRes();
+ await handler(mockReq({ orbit_type: "GEO", status: "decommissioned" }), resBoth);
+
+ expect(resBoth._body.spacecrafts.length).toBeLessThanOrEqual(resAll._body.spacecrafts.length);
+ for (const r of resBoth._body.spacecrafts) {
+ expect(r.orbit_type).toBe("GEO");
+ expect(r.status).toBe("decommissioned");
+ }
+ });
+
+ test("unknown filter param is ignored, returns full collection", async () => {
+ const res = mockRes();
+ await handler(mockReq({ not_a_field: "foo" }), res);
+ expect(res._body.spacecrafts).toHaveLength(113);
+ });
+
+ test("filter that matches nothing returns empty array", async () => {
+ const res = mockRes();
+ await handler(mockReq({ status: "this_does_not_exist" }), res);
+ expect(res._body.spacecrafts).toHaveLength(0);
+ });
+});
diff --git a/tests/api/stats.test.js b/tests/api/stats.test.js
new file mode 100644
index 0000000..40b6923
--- /dev/null
+++ b/tests/api/stats.test.js
@@ -0,0 +1,75 @@
+const handler = require("../../api/stats");
+const { mockReq, mockRes } = require("../helpers/mock");
+
+describe("GET /api/stats", () => {
+ let body;
+
+ beforeAll(async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ body = res._body;
+ });
+
+ test("returns 200 with application/json header", async () => {
+ const res = mockRes();
+ await handler(mockReq(), res);
+ expect(res._status).toBe(200);
+ expect(res._headers["Content-Type"]).toBe("application/json");
+ });
+
+ test("response has all top-level sections", () => {
+ expect(body).toHaveProperty("totals");
+ expect(body).toHaveProperty("spacecraft_missions");
+ expect(body).toHaveProperty("spacecrafts");
+ expect(body).toHaveProperty("customer_satellites");
+ expect(body).toHaveProperty("launchers");
+ });
+
+ test("totals match actual collection sizes", () => {
+ expect(body.totals.spacecrafts).toBe(113);
+ expect(body.totals.launchers).toBe(81);
+ expect(body.totals.customer_satellites).toBe(75);
+ expect(body.totals.centres).toBe(44);
+ expect(body.totals.spacecraft_missions).toBe(64);
+ });
+
+ test("mission status counts sum to total missions", () => {
+ const sum = Object.values(body.spacecraft_missions.by_status).reduce((a, b) => a + b, 0);
+ expect(sum).toBe(body.totals.spacecraft_missions);
+ });
+
+ test("mission orbit_type counts sum to total missions", () => {
+ const sum = Object.values(body.spacecraft_missions.by_orbit_type).reduce((a, b) => a + b, 0);
+ expect(sum).toBe(body.totals.spacecraft_missions);
+ });
+
+ test("mission type counts sum to total missions", () => {
+ const sum = Object.values(body.spacecraft_missions.by_mission_type).reduce((a, b) => a + b, 0);
+ expect(sum).toBe(body.totals.spacecraft_missions);
+ });
+
+ test("spacecraft status counts sum to total spacecrafts", () => {
+ const sum = Object.values(body.spacecrafts.by_status).reduce((a, b) => a + b, 0);
+ expect(sum).toBe(body.totals.spacecrafts);
+ });
+
+ test("customer satellite country counts sum to total satellites", () => {
+ const sum = Object.values(body.customer_satellites.by_country).reduce((a, b) => a + b, 0);
+ expect(sum).toBe(body.totals.customer_satellites);
+ });
+
+ test("total_mass_kg is a positive number", () => {
+ expect(typeof body.customer_satellites.total_mass_kg).toBe("number");
+ expect(body.customer_satellites.total_mass_kg).toBeGreaterThan(0);
+ });
+
+ test("launcher vehicle_family counts sum to total launchers", () => {
+ const sum = Object.values(body.launchers.by_vehicle_family).reduce((a, b) => a + b, 0);
+ expect(sum).toBe(body.totals.launchers);
+ });
+
+ test("known statuses present in mission breakdown", () => {
+ const statuses = Object.keys(body.spacecraft_missions.by_status);
+ expect(statuses).toEqual(expect.arrayContaining(["active", "decommissioned", "failed"]));
+ });
+});
diff --git a/tests/data/integrity.test.js b/tests/data/integrity.test.js
new file mode 100644
index 0000000..a82b1fa
--- /dev/null
+++ b/tests/data/integrity.test.js
@@ -0,0 +1,189 @@
+/**
+ * Data integrity tests — verify that the JSON data files meet
+ * the quality standards established by the normalization pipeline.
+ * These tests act as a regression guard against scraper regressions
+ * or manual edits that corrupt the schema.
+ */
+
+const spacecraftsData = require("../../data/spacecrafts.json");
+const launchersData = require("../../data/launchers.json");
+const customerSatellitesData = require("../../data/customer_satellites.json");
+const centresData = require("../../data/centres.json");
+const missionsData = require("../../data/spacecraft_missions.json");
+
+const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/;
+const VALID_STATUSES = ["active", "decommissioned", "failed", "unknown"];
+const VALID_ORBIT_TYPES = ["LEO", "SSO", "GEO", "Lunar", "Interplanetary", "Failed"];
+const VALID_VEHICLE_FAMILIES = ["SLV", "ASLV", "PSLV", "GSLV", "GSLV Mk III", "LVM-3", "RLV", "Scramjet-TD"];
+
+describe("data/spacecrafts.json", () => {
+ const records = spacecraftsData.spacecrafts;
+
+ test("has 113 records", () => expect(records).toHaveLength(113));
+
+ test("all IDs are unique positive integers", () => {
+ const ids = records.map((r) => r.id);
+ expect(new Set(ids).size).toBe(records.length);
+ for (const id of ids) expect(Number.isInteger(id) && id > 0).toBe(true);
+ });
+
+ test("all names are non-empty strings", () => {
+ for (const r of records) {
+ expect(typeof r.name).toBe("string");
+ expect(r.name.trim().length).toBeGreaterThan(0);
+ }
+ });
+
+ test("no trailing whitespace in names", () => {
+ for (const r of records) {
+ expect(r.name).toBe(r.name.trim());
+ }
+ });
+
+ test("non-null launch_dates are ISO 8601", () => {
+ for (const r of records) {
+ if (r.launch_date !== null) expect(r.launch_date).toMatch(ISO_DATE);
+ }
+ });
+
+ test("non-null mass_kg values are positive numbers", () => {
+ for (const r of records) {
+ if (r.mass_kg !== null) {
+ expect(typeof r.mass_kg).toBe("number");
+ expect(r.mass_kg).toBeGreaterThan(0);
+ }
+ }
+ });
+
+ test("non-null status values are from known enum", () => {
+ for (const r of records) {
+ if (r.status !== null) expect(VALID_STATUSES).toContain(r.status);
+ }
+ });
+
+ test("non-null orbit_type values are from known enum", () => {
+ for (const r of records) {
+ if (r.orbit_type !== null) expect(VALID_ORBIT_TYPES).toContain(r.orbit_type);
+ }
+ });
+});
+
+describe("data/spacecraft_missions.json", () => {
+ const records = missionsData.spacecraft_missions;
+
+ test("has 64 records", () => expect(records).toHaveLength(64));
+
+ test("all IDs are unique positive integers", () => {
+ const ids = records.map((r) => r.id);
+ expect(new Set(ids).size).toBe(records.length);
+ for (const id of ids) expect(Number.isInteger(id) && id > 0).toBe(true);
+ });
+
+ test("all records have a status field from known enum", () => {
+ for (const r of records) {
+ expect(VALID_STATUSES).toContain(r.status);
+ }
+ });
+
+ test("non-null launch_dates are ISO 8601", () => {
+ for (const r of records) {
+ if (r.launch_date !== null) expect(r.launch_date).toMatch(ISO_DATE);
+ }
+ });
+
+ test("non-null orbit_type values are from known enum", () => {
+ for (const r of records) {
+ if (r.orbit_type !== null) expect(VALID_ORBIT_TYPES).toContain(r.orbit_type);
+ }
+ });
+
+ test("non-null mass_kg values are positive numbers", () => {
+ for (const r of records) {
+ if (r.mass_kg !== null) {
+ expect(typeof r.mass_kg).toBe("number");
+ expect(r.mass_kg).toBeGreaterThan(0);
+ }
+ }
+ });
+
+ test("non-null power_watts values are positive numbers", () => {
+ for (const r of records) {
+ if (r.power_watts !== null) {
+ expect(typeof r.power_watts).toBe("number");
+ expect(r.power_watts).toBeGreaterThan(0);
+ }
+ }
+ });
+
+ test("no record has values in wrong fields (mass field not a spacecraft name)", () => {
+ for (const r of records) {
+ if (r.mass_kg !== null) {
+ expect(typeof r.mass_kg).toBe("number");
+ }
+ }
+ });
+});
+
+describe("data/customer_satellites.json", () => {
+ const records = customerSatellitesData.customer_satellites;
+
+ test("has 75 records", () => expect(records).toHaveLength(75));
+
+ test("all IDs are unique positive integers", () => {
+ const ids = records.map((r) => r.id);
+ expect(new Set(ids).size).toBe(records.length);
+ });
+
+ test("non-null launch_dates are ISO 8601", () => {
+ for (const r of records) {
+ if (r.launch_date !== null) expect(r.launch_date).toMatch(ISO_DATE);
+ }
+ });
+
+ test("non-null mass_kg values are positive numbers", () => {
+ for (const r of records) {
+ if (r.mass_kg !== null) {
+ expect(typeof r.mass_kg).toBe("number");
+ expect(r.mass_kg).toBeGreaterThan(0);
+ }
+ }
+ });
+
+ test("country names are title case (not all-caps)", () => {
+ for (const r of records) {
+ if (r.country !== null) {
+ expect(r.country).toBe(r.country.charAt(0).toUpperCase() + r.country.slice(1));
+ expect(r.country).not.toBe(r.country.toUpperCase());
+ }
+ }
+ });
+});
+
+describe("data/launchers.json", () => {
+ const records = launchersData.launchers;
+
+ test("has 81 records", () => expect(records).toHaveLength(81));
+
+ test("non-null vehicle_family values are from known enum", () => {
+ for (const r of records) {
+ if (r.vehicle_family !== null) {
+ expect(VALID_VEHICLE_FAMILIES).toContain(r.vehicle_family);
+ }
+ }
+ });
+});
+
+describe("data/centres.json", () => {
+ const records = centresData.centres;
+
+ test("has 44 records", () => expect(records).toHaveLength(44));
+
+ test("all records use lowercase field names (not Place/State)", () => {
+ for (const r of records) {
+ expect(r).not.toHaveProperty("Place");
+ expect(r).not.toHaveProperty("State");
+ expect(r).toHaveProperty("place");
+ expect(r).toHaveProperty("state");
+ }
+ });
+});
diff --git a/tests/helpers/mock.js b/tests/helpers/mock.js
new file mode 100644
index 0000000..2376413
--- /dev/null
+++ b/tests/helpers/mock.js
@@ -0,0 +1,31 @@
+/**
+ * Minimal req/res mocks for testing Vercel serverless handlers directly.
+ * No HTTP server needed — handlers are just async functions.
+ */
+
+function mockReq(query = {}) {
+ return { query };
+}
+
+function mockRes() {
+ const res = {
+ _status: 200,
+ _body: null,
+ _headers: {},
+ status(code) {
+ this._status = code;
+ return this;
+ },
+ send(body) {
+ this._body = body;
+ return this;
+ },
+ setHeader(key, val) {
+ this._headers[key] = val;
+ return this;
+ },
+ };
+ return res;
+}
+
+module.exports = { mockReq, mockRes };