Based on my testing, this is because threads can only be started once, and as the timer relies on a thread, the timer can only be started once. This means that the only way to re-start the timer would be to do:

def newTimer():
    global t
    t = Timer(10.0,api_call)
newTimer()

instead of the t = Timer part, and do

t.cancel()
newTimer()
t.start()

instead of the current re-start code.

This makes your full code:

from threading import Timer

def api_call():
    print("Call that there api")

def newTimer():
    global t
    t = Timer(10.0,api_call)
newTimer()


def my_callback(channel):

    if something_true:
        print('reset timer and start again')
        t.cancel()
        newTimer()
        t.start()
        print("\n timer started")
    elif something_else_true:
        t.cancel()
        print("timer canceled")
    else:
       t.cancel()
       print('cancel timer for sure')

try:
    if outside_input_that_can_happen_a_lot:
        my_callback()

finally:
    #cleanup objects

Hope this helps.

Answer from CrazySqueak on Stack Overflow
🌐
Python
docs.python.org › 3 › library › threading.html
threading — Thread-based parallelism — Python 3.14.4 ...
Timers are started, as with threads, by calling their Timer.start method. The timer can be stopped (before its action has begun) by calling the cancel() method.
🌐
GitHub
gist.github.com › aeroaks › ac4dbed9c184607a330c
Reset Timer in Python · GitHub
Reset Timer in Python. GitHub Gist: instantly share code, notes, and snippets.
🌐
PyPI
pypi.org › project › resettabletimer
Client Challenge
JavaScript is disabled in your browser · Please enable JavaScript to proceed · A required part of this site couldn’t load. This may be due to a browser extension, network issues, or browser settings. Please check your connection, disable any ad blockers, or try using a different browser
🌐
ActiveState
code.activestate.com › recipes › 577407-resettable-timer-class-a-little-enhancement-from-p
Resettable Timer class (a little enhancement from python builtin Timer class) « Python recipes « ActiveState Code
So, took the initiative to look at builtin python Timer code and add an enhancement to support reset function, as well as changing the timer interval time while calling reset. ... This seems not to work: once the timer stopped running, it can't be restarted whatsoever. Is there a way to make a timer restart after it's finished? Eddy Jacob (author) 10 years, 11 months ago # | flag · The Timer is based on Thread...
🌐
Python
mail.python.org › pipermail › tutor › 2012-November › 092767.html
[Tutor] Reusing Timers (threading.timer)
November 14, 2012 - I expect that calling my_timer.start() after cancelling it would restart it, but haven't tested it. Just because you create a new timer doesn't mean you have to give it an entirely new name. > 3. If I get a value from a textbox, how do I parse it from the string > value to an integer (or float)? This has nothing to do with timers, and should go into a separate email thread so that those people who know nothing about threading can contribute.
🌐
ProgramCreek
programcreek.com › python › example › 2317 › threading.Timer
Python Examples of threading.Timer
def start(self, instance, fields=None, restore=None, send_update=None): """ Starts a threading.Timer chain, to repeatedly update a resource instances's expirationTime. @param instance: resource instance @param fields: additional fields mandatory during update @param restore: function that will restore the instance, if it has expired accidentally. Has to restart the refresher.
Find elsewhere
🌐
EDUCBA
educba.com › home › software development › software development tutorials › python tutorial › python threading timer
Python Threading Timer | Various Examples of Python Threading Timer
March 23, 2023 - Python’s threading.Timer() starts after the delay specified as an argument within the threading. Timer class itself and thus delaying the execution of the subsequent operation by the same duration of time.
Address   Unit no. 202, Jay Antariksh Bldg, Makwana Road, Marol, Andheri (East),, 400059, Mumbai
🌐
Bogotobogo
bogotobogo.com › python › Multithread › python_multithreading_subclassing_Timer_Object.php
Python Multithreading Tutorial: Timer Object - 2020
Timers are started, as with threads, by calling their start() method. The timer can be stopped (before its action has begun) by calling the cancel() method.
🌐
Webscale
section.io › home › blog
How to Perform Threading Timer in Python
June 24, 2025 - Get the latest insights on AI, personalization, infrastructure, and digital commerce from the Webscale team and partners.
🌐
Delft Stack
delftstack.com › home › howto › python › threading.timer python
Timer Class in the Threading Module in Python | Delft Stack
October 10, 2023 - Now that we are done with the theory, let us understand how we can practically use this class to create an infinite timer. Refer to the following code for the same. from time import sleep from threading import Timer from datetime import datetime class MyInfiniteTimer: """ A Thread that executes infinitely """ def __init__(self, t, hFunction): self.t = t self.hFunction = hFunction self.thread = Timer(self.t, self.handle_function) def handle_function(self): self.hFunction() self.thread = Timer(self.t, self.handle_function) self.thread.start() def start(self): self.thread = Timer(self.t, self.handle_function) self.thread.start() def cancel(self): self.thread.cancel() def print_current_datetime(): print(datetime.today()) t = MyInfiniteTimer(1, print_current_datetime) t.start() sleep(5) t.cancel() sleep(5) t.start() sleep(5) t.cancel()
🌐
Super Fast Python
superfastpython.com › timer-thread-in-python
Threading Timer Thread in Python – SuperFastPython
March 1, 2022 - You can use a timer thread object in Python via the threading.Timer class.
🌐
Experts Exchange
experts-exchange.com › questions › 28449810 › Proper-timer-in-Python.html
Solved: Proper timer in Python | Experts Exchange
June 8, 2014 - Whenever the wait for timeout or for the event appears, the thread is stopped, and it does not do anything else. The wait or the like operation is inevitable. You can have a look at the threading.Timer (actually _Timer) implementation of the run method -- it implements the thread activity.
🌐
Super Fast Python
superfastpython.com › home › tutorials › how to restart a thread in python
How to Restart a Thread in Python - Super Fast Python
September 11, 2022 - You cannot restart a thread in Python, instead you must create and start a new thread with the same configuration. In this tutorial you will discover how to simulate restarting a thread in Python.
🌐
Raspberry Pi Forums
forums.raspberrypi.com › board index › programming › python
A resetable background timer? - Raspberry Pi Forums
Is there a timer (well, damn) which fires every let's say second and allows for a callback? ... import threading # this is bulit in library timeout_obj = []# intial a list to store a timer w def button(xxx,yyy): xxxxxxxx self.timeout_obj.cancel()#cancel the timer which declare before timeout_obj = threading.Timer(23.0, timer_reaction) def timer_reaction(xxx,yyy): xxxxxxxxx
🌐
Studytonight
studytonight.com › python › python-threading-timer-object
Python Timer Object | Studytonight
threading.Timer(interval, function, args=[], kwargs={}) This way we can create a timer object that will run the function with arguments args and keyword arguments kwargs, after interval seconds have passed. In the Timer class we have two methods used for starting and cancelling the execution of the timer object.