北海市因市區北面瀕臨海而得名,始見于清康熙初年,清嘉慶年以來沿稱為市。秦屬象郡地,漢為合浦縣地。清康熙元年(1662)設北海鎮標。1876年中英《煙臺條約》辟為通商口岸。1926年設“北海市政籌備處”,1929年置北海鎮。
1949年12月4日解放,當時為鎮,歸合浦縣管轄。1951年1月改為廣東省轄市,同年5月委托廣西省領導,1952年3月正式劃歸廣西。1955年5月重歸廣東,1956年降為縣級市,1958年降為合浦縣北海人民公社。1959年改為縣級鎮,1964年恢復為縣級市。1965年6月劃歸廣西壯族自治區。
1982年經國務院批準,北海市成為旅游對外開放城市。1983年10月8日,國務院(國函字215號)批準:欽州地區的北海市改由自治區直接領導。1984年4月北海市被國務院確定為進一步對外開放的十四個沿海城市之一。1987年5月21日,國務院(國函[1987]84號)批準:將欽州地區的合浦縣劃歸北海市管轄(7月1日實施)。
1990年7月21日,廣西壯族自治區人民政府批準(桂政函[1990]20號):北海市郊區的地角鎮和西塘鄉的徐屋、譚屋、張屋、大乪、體育里、塘仔、石子嶺、三合口、沈四、油行、火燒床、屋仔、發寶、紅坎、沙井頭、丁屋、勞屋、上村、陳屋、莫屋、后塘、李屋等22個自然村,以及高德鎮的勒棚村劃歸海城區管轄;同時,將地角鎮改為街道辦事處,作為海城區人民政府的派出機構。
1994年12月17日,《國務院關于同意廣西壯族自治區調整北海市市轄區行政區劃的批復》(國函[1994]137號):一、同意撤銷北海市郊區,設立銀海區。銀海區轄從合浦縣劃入的福成鎮,原郊區的僑港鎮、咸田鎮、高德鎮和西塘鎮,海城區的大墩海、南氵萬、新村3個居委會。區人民政府駐明珠大道。二、新設鐵山港區。鐵山港區轄從合浦縣劃入的南康鎮、營盤鎮。區人民政府駐南康鎮。三、擴大海城區的行政區域,將原郊區的潿洲鎮(含斜陽島)、高德鎮的馬欄、軍屯、開江、垌尾、翁山、赤西、高農8個村公所和第一、第二、沙腳、嶺底、廟山5個居委會及平陽村公所的螺殼村、龍溝蘆村,西塘鎮的西塘、西邊垌、驛馬三個村公所劃歸海城區管轄。區人民政府駐北部灣大道。
2000年第五次全國人口普查,北海市總人口1423236人。其中:海城區273413人、銀海區138852人、鐵山港區146370人、合浦縣864601人。