Вихованець футбольної школи клубу «Динамо» (Загреб). Навесні 2008 року був переведений до основного складу команди.
Влітку 2008 року був переданий в довгострокову оренду в клуб «Локомотива», який з 2006 року був фарм-клубом «Динамо». У першому сезоні провів 13 матчів, а його клуб отримав право виступати в Першій лізі. У січні 2009 року Йосип підписав контракт з «Динамо» терміном на сім з половиною років. 26 липня 2009 року Пиварич дебютував у вищому футбольному дивізіоні Хорватії в матчі проти «Рієки»[1]. У сезоні 2009/10 Йосип взяв участь у 9 зустрічах, на наступний рік він міцно зайняв місце в стартовому складі «Локомотиви» і відіграв 29 матчів.
В кінці 2011 року, беручи до уваги успішну гру захисника, «Динамо» ухвалило рішення про повернення Йосипа з оренди. 21 березня 2012 року Пиварич провів свій перший матч за динамівців у грі проти клубу «Славен Белупо» (2:0)[2]. За підсумками сезону «Динамо» завоювало чемпіонський титул.
У сезоні 2012/13 Йосип регулярно виходив в основному складі на позиції лівого захисника. 18 липня 2012 року у матчі другого кваліфікаційного раунду Ліги чемпіонів проти болгарського «Лудогорця» відбувся дебют Пиварича в єврокубках[3]. Динамівцям вдалося пробитися в груповий етап турніру, Йосип взяв участь у всіх 6 зустрічах свого клубу.
Надалі продовжив виступати за команду, вигравши загалом з нею п'ять поспіль чемпіонств, три національні Кубки та один Суперкубок. Влітку 2017 року команду очолив Маріо Цвитанович і через місяць після його призначення в команді з'явився новий лівий захисник — 26-річний чех Ян Лецякс з «Янг Бойз», який став основним гравцем, а його дублером — 19-річний Борна Соса. Через це у чотирьох матчах чемпіонату і двох Ліги Європи Пиварич лише раз потрапив в заявку, але на поле так і не вийшов[4].
«Динамо» (Київ)
8 серпня 2017 року став гравцем київського«Динамо»[5]. 20 серпня дебютував за першу команду в матчі Прем'єр-ліги проти кам'янської «Сталі», вийшовши в стартовому складі[6], проте вже на 7 хвилині отримав травму і був замінений на іншого дебютанта Віталія Миколенка[7]. Через травму київський клуб змушений був скасувати презентацію гравця[8].
До кінця 2018 року був основним лівим захисником киян. У січні 2019 під час матчу на зборах проти чеської «Спарти» пошкодив передні хрестоподібні зв'язки коліна, у зв'язку з чим пропустив весь 2019 рік[9]. Під час зимової перерви 201929 Йосип пройшов повноцінну підготовку разом з командою і вперше за тривалий час вийшов на поле 7 березня 2020 року в гостьовому матчі проти «Олександрії» (3:1), вийшовши на заміну на 84-й хвилині, замінивши Назарія Русина. А у стартовому складі команди Пиварич вийшов лише 17 червня у кубковій грі з «Минаєм» (2:0), через півтора року після останньої гри за «біло-синіх» в основі — 3 листопада 2018 року в матчі Прем'єр-ліги проти «Шахтаря» (1:2)[10].
Виступи за збірні
2005 року дебютував у складі юнацької збірної Хорватії, взяв участь у 28 іграх на юнацькому рівні, відзначившись 2 забитими голами.
2008 року залучався до складу молодіжної збірної Хорватії. На молодіжному рівні зіграв в одному офіційному матчі.
14 серпня 2013 року дебютував в офіційних іграх у складі національної збірної Хорватії у товариському матчі проти збірної Лихтенштейну[11]. Проте основним гравцем тривалий час не був, програючи позицію лівого захисника Івану Стриничу та Шиме Врсалько. Тим не менш на Євро-2016 не поїхав лише через травму, якої зазнав у січні того ж року і відновлювався аж до липня[12]. Лише після Євро Пиварич став основним гравцем «картатих», вигравши конкуренцію у Марина Леоваца, оскільки Стринич перестав потрапляти в склад «Наполі», а Врсалько був переведений на правий фланг замість Даріо Срни, який завершив виступи за збірну[4].
2018 року поїхав у складі збірної на тогорічний чемпіонат світу, щоправда, як дублер основного лівого захисника Івана Стринича. Після того, як хорвати перемогли у двох стартових матчах групового етапу і завчасно оформили вихід до стадії плей-оф, тренерський штаб дав відпочити ключовим гравцям команди, випустивши на третю гру проти Ісландії відразу низку нових гравців, включаючи Пиварича. У своєму дебютному матчі у фінальних частинах великих міжнародних турнірів відразу відзначився результативною передачею на Мілана Баделя, який відкрив рахунок у зустрічі, що завершилася перемогою його команди з рахунком 2:1. Після цього виходив на поле у наступних матчах в 1/8 фіналі, чвертьфіналі та півфіналі, пропустивши лише фінал, в якому його команда поступилась і стала віце-чемпіоном світу. Не потиснув руки Путіну під час церемонії нагородження ЧС-2018[13].