GTA Wiki
GTA Wiki

What would you say if I told you some fools I knew were running a little racing competition? And as luck would have it, they got this beautiful silver medal with your name on it.


Hao Street Races are a series of street races in Grand Theft Auto V for protagonist Franklin Clinton.


The first race is presented to the player by Hao, during the Strangers and Freaks mission, Shift Work. After completing the mission, a new race will be unlocked by a text message from Hao and Franklin must continue to win the races in order to proceed to the next one. There are a total of five races in the series, and are only accessible between 20:00 and 05:00 hours. Earning a medal in each of the Hao Street Races counts as 5 of the compulsory 42 Hobbies and Pastimes to achieve 100% Completion.


Shift Work

There is no entry fee for this race. It is two laps long and starts at Forum Drive in Chamberlain Hills against Hao and four other drivers. The reward for winning the race is $200. This race is triggered by meeting Hao for the first time in his Strangers and Freak mission and you must race him and four other racers.

It can be replayed through the Strangers and Freaks replay menu or by meeting the group of racers in Chamberlain Hills. If meeting the racers, the entry fee is $100 and the reward is $450 and Hao won't be taking part in the race. No 100% gold medal achievements can be completed this way, only through replay. If played through replay, the amount of money earned by winning the race won't be added to the player's account as he returns to the normal gameplay.

100% tasks

  • Fastest Lap: Complete a lap within 01:20.
  • Underdog: Finish the race within 02:50.
  • Clean Race: Finish the race with less than 5 collisions.

City Circuit

The entry fee is $500. The race is one lap long. It starts on Clinton Avenue in Downtown Vinewood and goes throughout the northern and western part of Los Santos. The reward for winning is $2250.


The entry fee is $1000. The race is two laps long. It starts near the terminal of Los Santos International Airport and goes throughout much of southern Los Santos. The reward for winning the race is $4500.


The entry fee is $1250. The race is two laps long. It focuses on freeways such as the Olympic Freeway and the Del Perro Freeway, but is a very short course focusing primarily on the on- and off-ramps. The prize for winning is $5625.

Vespucci Canals

The entry fee is $1500. The race is two laps long and is for motorcycles only. It starts on Invention Court in Vespucci Canals, passing through the neighborhood of Vespucci and Del Perro. The reward for winning is $6750.

After winning all the races, Hao will call to congratulate the player.

Disallowed Vehicles

The player can race a large majority of vehicles, however, certain vehicles will not be allowed to enter the races. A list of vehicles the player cannot race in is as follows:


Cut Races


Not much is known about this race other than it being a circuit race around the docks.

Sea Races

The Sea Races were originally part of this sequence (presumably for Franklin only) but on release were changed to be accessible to all protagonists like the Offroad Races.[2][3]

Video Walkthrough


  • If the Strangers and Freaks mission "Shift Work" is replayed, there will be a red Ruiner[4] parked nearby as a default car ready to be used, though the player still can use any other vehicle of their choice for the race.
  • If a player approaches a race gathering and decides to steal one of the cars, the race will be dismissed and the other contestants will usually run off scared.
  • If a player acquires a wanted level in a race, they will automatically fail the race.
  • Cars driven by NPC racers include: the Banshee, Feltzer, Sentinel XS, Prairie, and Dominator. These cars have modifications such as roll cages, and spoilers.
  • At the beginning of each race, the car's radio will always be tuned into Soulwax FM.
  • The track layout of the Freeway race is shaped like a penis. This is another example of sexual innuendo made by Rockstar.
  • The events of the Shift Work race is briefly mentioned by Hao in GTA Online: Los Santos Tuners. It is also mentioned that Hao ended up on third place in that race.


  1. File Data:
    // Position - 0x344EA
    bool func_489() {
    	int iVar0;
    	int iVar1;
    	int iVar2[89];
    	if (ped::is_ped_sitting_in_any_vehicle(player::player_ped_id())) {
    		iLocal_1171 = player::get_players_last_vehicle();
    		if (func_11(iLocal_1171)) {
    			iVar0 = entity::get_entity_model(iLocal_1171);
    			if (func_490(iVar0)) {
    				return false;
    			if (iVar0 == joaat("police4") || iVar0 == joaat("policeold1") || iVar0 == joaat("policeold2") ||
    				iVar0 == joaat("fbi") || iVar0 == joaat("fbi2") || iVar0 == joaat("lguard") ||
    				iVar0 == joaat("sheriff") || iVar0 == joaat("sheriff2")) {
    				return false;
    			if (vehicle::is_this_model_a_bike(iVar0) || vehicle::is_this_model_a_boat(iVar0) ||
    				vehicle::is_this_model_a_heli(iVar0) || vehicle::is_this_model_a_plane(iVar0)) {
    				return false;
    			iVar2[0] = joaat("ambulance");
    			iVar2[1] = joaat("benson");
    			iVar2[2] = joaat("biff");
    			iVar2[3] = joaat("bus");
    			iVar2[4] = joaat("firetruk");
    			iVar2[5] = joaat("forklift");
    			iVar2[6] = joaat("mule");
    			iVar2[7] = joaat("mule2");
    			iVar2[8] = joaat("packer");
    			iVar2[9] = joaat("phantom");
    			iVar2[10] = joaat("mower");
    			iVar2[11] = joaat("stockade");
    			iVar2[12] = joaat("squalo");
    			iVar2[13] = joaat("maverick");
    			iVar2[14] = joaat("polmav");
    			iVar2[15] = joaat("airtug");
    			iVar2[16] = joaat("pranger");
    			iVar2[17] = joaat("annihilator");
    			iVar2[18] = joaat("dinghy");
    			iVar2[19] = joaat("police");
    			iVar2[20] = joaat("ripley");
    			iVar2[21] = joaat("trash");
    			iVar2[22] = joaat("burrito");
    			iVar2[23] = joaat("pony");
    			iVar2[24] = joaat("speedo");
    			iVar2[25] = joaat("marquis");
    			iVar2[26] = joaat("sanchez");
    			iVar2[27] = joaat("airtug");
    			iVar2[28] = joaat("taco");
    			iVar2[29] = joaat("barracks");
    			iVar2[30] = joaat("romero");
    			iVar2[31] = joaat("blazer");
    			iVar2[32] = joaat("blazer2");
    			iVar2[33] = joaat("bodhi2");
    			iVar2[34] = joaat("boxville2");
    			iVar2[35] = joaat("bulldozer");
    			iVar2[36] = joaat("caddy");
    			iVar2[37] = joaat("caddy2");
    			iVar2[38] = joaat("camper");
    			iVar2[39] = joaat("tiptruck");
    			iVar2[40] = joaat("tourbus");
    			iVar2[41] = joaat("towtruck");
    			iVar2[42] = joaat("towtruck2");
    			iVar2[43] = joaat("tractor");
    			iVar2[44] = joaat("tractor2");
    			iVar2[45] = joaat("utillitruck");
    			iVar2[46] = joaat("utillitruck2");
    			iVar2[47] = joaat("utillitruck3");
    			iVar2[48] = joaat("ratloader");
    			iVar2[49] = joaat("dloader");
    			iVar2[50] = joaat("docktug");
    			iVar2[51] = joaat("dump");
    			iVar2[52] = joaat("gburrito");
    			iVar2[53] = joaat("handler");
    			iVar2[54] = joaat("hauler");
    			iVar2[55] = joaat("journey");
    			iVar2[56] = joaat("rentalbus");
    			iVar2[57] = joaat("mixer");
    			iVar2[58] = joaat("rhino");
    			iVar2[59] = joaat("cutter");
    			iVar2[60] = joaat("pounder");
    			iVar2[61] = joaat("tiptruck2");
    			iVar2[62] = joaat("mixer2");
    			iVar2[63] = joaat("rubble");
    			iVar2[64] = joaat("scrap");
    			iVar2[65] = joaat("armytanker");
    			iVar2[66] = joaat("barracks2");
    			iVar2[67] = joaat("airbus");
    			iVar2[68] = joaat("coach");
    			iVar2[69] = joaat("pbus");
    			iVar2[70] = joaat("riot");
    			iVar2[71] = joaat("boxville3");
    			iVar2[72] = joaat("stockade3");
    			iVar2[73] = joaat("flatbed");
    			iVar2[74] = joaat("boxville");
    			iVar2[75] = joaat("burrito2");
    			iVar2[76] = joaat("burrito3");
    			iVar2[77] = joaat("burrito4");
    			iVar2[78] = joaat("rumpo");
    			iVar2[79] = joaat("speedo2");
    			iVar2[80] = joaat("blimp");
    			iVar2[81] = joaat("blimp2");
    			iVar2[82] = joaat("submersible");
    			iVar2[83] = joaat("submersible2");
    			iVar2[84] = joaat("blazer3");
    			iVar2[85] = joaat("pony2");
    			iVar2[86] = joaat("rumpo2");
    			iVar2[87] = joaat("taxi");
    			iVar2[88] = 0;
    			iVar1 = 0;
    			while (iVar1 < iVar2) {
    				if (iVar0 == iVar2[iVar1]) {
    					return false;
    			return true;
    	return false;
    // Position - 0x349BA
    bool func_490(int iParam0) {
    	switch (iParam0) {
    	case joaat("police"):
    	case joaat("police2"):
    	case joaat("police3"):
    	case joaat("police4"):
    	case joaat("polmav"):
    	case joaat("policeb"):
    	case joaat("policet"):
    	case joaat("policeold2"):
    	case joaat("policeold1"):
    	case joaat("sheriff"):
    	case joaat("sheriff2"): return true;
    	return false;
  2. Script: Mission_Race:
    	switch (iParam1)
    		case 0:
    			sVar2 = "SLOSSANTOS";
    		case 1:
    			sVar2 = "CITYCIRCUIT";
    		case 2:
    			sVar2 = "AIRPORTR";
    		case 3:
    			sVar2 = "FREEWAY";
    		case 4:
    			sVar2 = "VERSPUCCI";
    		case 5:
    			sVar2 = "NORTHCOAST";
    		case 6:
    			sVar2 = "SOUTHCOAST";
    		case 7:
    			sVar2 = "CANYON";
    		case 8:
    			sVar2 = "LOSSANTOS";
  3. hao1.gxt2
    === hao1.gxt2 - Hao 1 (Shift Work) ===
    HAO1_3 = Get a suitable car to race.
    HAO1_4 = This vehicle is not suitable.
    SEA_BACK = ~s~Get back on the ~b~Seashark.
    //>Get a suitable car to race/This vehicle is not suitable
    //>Get Back on the Seashark
  4. File Data
    if (!entity::does_entity_exist(uParam0->f_35[1])) {
    			func_649(&uParam0->f_35[1], iVar0[3], -91.07f, -1273.45f, 28.86f, 0.57f);
    			vehicle::set_vehicle_colour_combination(uParam0->f_35[1], 10);
    iVar0[3] = joaat("ruiner");
    and colour combination 10 = (carvariations.ymt ruiner colour 11):
                <Item value="31" />
                <Item value="0" />
                <Item value="36" />
                <Item value="156" />