# "service has no terminators" error using Python SDK

**URL:** <https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131>\
**Category:** Ziti Overlay\
**Created:** [September 22, 2025, 12:19pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131 "2025-09-22T12:19:16Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mathis](https://avatars.discourse-cdn.com/v4/letter/m/278dde/32.png) [@Mathis](https://openziti.discourse.group/u/Mathis)\
**Post date:** [September 22, 2025, 12:19pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/1 "2025-09-22T12:19:16Z")

</div>

Hello everyone, I am currently trying to create a Flask host using the python SDK. I've copied the [git sample](https://github.com/openziti/ziti-sdk-py/blob/main/sample/flask-of-ziti/helloFlazk.py) for an easy start, but still can't get a connection going between client and host.

The host seems to bind to the service correctly, according to the logs, but then when trying to dial with a client, I get the following error :

> **Error**
>
> ERROR ziti-sdk:connect.c:1068 connect\_reply\_cb() conn0.0/K5JaKomr/Connecting failed to connect, reason=service AqErEuQI8ZfkKZzPTaVvt has no terminators for instanceId 45cb4a61-018d-4432-aff2-e0880b39687a.zpix"

I'm using the "bindUsingEdgeIdentity" option with randomly generated names for terminators, hence the long instance id.

I'm kind of lost about where to look now, as logs don't seem to indicate a problem on the host's side.

Here are the JSON config files for both host and intercept :

> **Host config**
>
> HOST
> 
> {  
> "\_links": {  
> "self": {  
> "href": "./configs/1s3Vsx3yJAZNHEhMMfLWd2"  
> }  
> },  
> "createdAt": "2025-07-19T11:45:36.285Z",  
> "id": "1s3Vsx3yJAZNHEhMMfLWd2",  
> "tags": {},  
> "updatedAt": "2025-07-30T19:24:43.134Z",  
> "configType": {  
> "\_links": {  
> "self": {  
> "href": "./config-types/NH5p4FpGR"  
> }  
> },  
> "entity": "config-types",  
> "id": "NH5p4FpGR",  
> "name": "host.v1"  
> },  
> "configTypeId": "NH5p4FpGR",  
> "data": {  
> "protocol": "tcp",  
> "address": "localhost",  
> "port": 2609,  
> "httpChecks": ,  
> "listenOptions": {  
> "bindUsingEdgeIdentity": true  
> },  
> "portChecks":   
> },  
> "name": "2609.host.v1"  
> }

> **Client config**
>
> CLIENT
> 
> {  
> "\_links": {  
> "self": {  
> "href": "./configs/1lWE1vGbL1RxPMtV2ODDRb"  
> }  
> },  
> "createdAt": "2025-07-21T11:00:14.710Z",  
> "id": "1lWE1vGbL1RxPMtV2ODDRb",  
> "tags": {},  
> "updatedAt": "2025-08-30T10:40:13.504Z",  
> "configType": {  
> "\_links": {  
> "self": {  
> "href": "./config-types/g7cIWbcGg"  
> }  
> },  
> "entity": "config-types",  
> "id": "g7cIWbcGg",  
> "name": "intercept.v1"  
> },  
> "configTypeId": "g7cIWbcGg",  
> "data": {  
> "portRanges": [  
> {  
> "high": 2609,  
> "low": 2609  
> }  
> ],  
> "addresses": [  
> "\*.zpix"  
> ],  
> "dialOptions": {  
> "identity": "$dst\_hostname"  
> },  
> "protocols": [  
> "tcp"  
> ]  
> },  
> "name": "2609.intercept.v1"  
> }

And here are the full debug logs for both sides as well, if needed.

> **Host logs**
>
> (103869)[0.000] INFO ziti-sdk:utils.c:196 ziti\_log\_set\_level() set log level: root=4/DEBUG  
> (103869)[0.000] INFO ziti-sdk:utils.c:165 ziti\_log\_init() Ziti C SDK version 1.7.8 @g727c6bf(HEAD) starting at (2025-09-22T11:31:47.171)  
> (103869)[0.000] DEBUG ziti-sdk:zitilib.c:1056 looper() loop is starting  
> (103869)[0.000] DEBUG ziti-sdk:zitilib.c:230 load\_ziti\_ctx() loading identity from ziti/identity.json  
> (103869)[0.000] INFO ziti-sdk:ziti.c:512 ziti\_start\_internal() ztx[0] enabling Ziti Context  
> (103869)[0.000] INFO ziti-sdk:ziti.c:528 ziti\_start\_internal() ztx[0] using tlsuv[v0.37.1/OpenSSL 3.5.0 8 Apr 2025]  
> (103869)[0.000] INFO ziti-sdk:ziti\_ctrl.c:637 ziti\_ctrl\_init() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] controller initialized  
> (103869)[0.000] DEBUG ziti-sdk:ziti\_ctrl.c:648 ziti\_ctrl\_init() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] ziti controller client initialized  
> (103869)[0.000] INFO ziti-sdk:ziti.c:606 ztx\_init\_controller() ztx[0] Loading ziti context with controller[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)]  
> (103869)[0.000] DEBUG ziti-sdk:ziti.c:537 ziti\_start\_internal() ztx[0] using metrics interval: 0  
> (103869)[0.000] DEBUG ziti-sdk:ziti.c:226 ziti\_set\_unauthenticated() ztx[0] setting auth\_state[0] to 0  
> (103869)[0.000] DEBUG ziti-sdk:ziti\_ctrl.c:380 ziti\_ctrl\_clear\_api\_session() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] clearing api session token for ziti\_controller  
> (103869)[0.000] DEBUG ziti-sdk:ziti\_ctrl.c:1106 ctrl\_paging\_req() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] starting paging request GET[/external-jwt-signers]  
> (103869)[0.112] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/version] in 0.107 s  
> (103869)[0.112] INFO ziti-sdk:ziti.c:2038 version\_pre\_auth\_cb() ztx[0] connected to Legacy controller [https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1) version v1.6.6(207d28c6bdee 2025-07-25T17:21:06Z)  
> (103869)[0.113] DEBUG ziti-sdk:legacy\_auth.c:238 auth\_timer\_cb() refreshing session[(nil)]  
> (103869)[0.126] DEBUG ziti-sdk:ziti\_ctrl.c:487 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] received 0/0 for paging request GET[/external-jwt-signers]  
> (103869)[0.126] DEBUG ziti-sdk:ziti\_ctrl.c:497 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed paging request GET[/external-jwt-signers] in 0.120 s  
> (103869)[0.126] DEBUG ziti-sdk:ziti.c:664 ext\_jwt\_singers\_cb() ztx[0] 0 external auth providers available  
> (103869)[0.141] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed POST[/authenticate?method=cert] in 0.028 s  
> (103869)[0.141] DEBUG ziti-sdk:ziti\_ctrl.c:394 ctrl\_login\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] authenticated successfully session[cmfv1qdwnwsf3eldvq4lv5py2]  
> (103869)[0.141] DEBUG ziti-sdk:legacy\_auth.c:170 login\_cb() logged in successfully =\> api\_session[cmfv1qdwnwsf3eldvq4lv5py2]  
> (103869)[0.141] DEBUG ziti-sdk:ziti.c:381 ziti\_set\_fully\_authenticated() ztx[0] setting auth\_state[0] to 3  
> (103869)[0.141] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[ziti.c:refresh\_cb] timeout[0]  
> (103869)[0.141] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[posture.c:ziti\_pr\_ticker\_cb] timeout[1]  
> (103869)[0.141] DEBUG ziti-sdk:legacy\_auth.c:309 refresh\_delay() api session set based on session-\>expireSeconds, next refresh in 3540s  
> (103869)[0.143] DEBUG ziti-sdk:ziti.c:1740 ztx\_process\_deadlines() ztx[0] calling ziti.c:refresh\_cb(0x7f21d8004bc0)  
> (103869)[0.143] DEBUG ziti-sdk:ziti\_ctrl.c:1106 ctrl\_paging\_req() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] starting paging request GET[/current-identity/edge-routers]  
> (103869)[0.143] DEBUG ziti-sdk:ziti.c:1740 ztx\_process\_deadlines() ztx[0] calling posture.c:ziti\_pr\_ticker\_cb(0x7f21d8004bc0)  
> (103869)[0.143] INFO ziti-sdk:posture.c:206 ziti\_send\_posture\_data() ztx[0] first run or potential controller restart detected  
> (103869)[0.143] DEBUG ziti-sdk:posture.c:210 ziti\_send\_posture\_data() ztx[0] posture checks must\_send set to TRUE, new\_session\_id[TRUE], must\_send\_every\_time[TRUE], new\_controller\_instance[TRUE]  
> (103869)[0.143] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[posture.c:ziti\_pr\_ticker\_cb] timeout[20000]  
> (103869)[0.170] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-api-session] in 0.028 s  
> (103869)[0.170] DEBUG ziti-sdk:ziti\_ctrl.c:394 ctrl\_login\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] authenticated successfully session[cmfv1qdwnwsf3eldvq4lv5py2]  
> (103869)[0.170] DEBUG ziti-sdk:ziti.c:2235 api\_session\_cb() ztx[0] app is not requiring expiration check  
> (103869)[0.184] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-identity] in 0.041 s  
> (103869)[0.197] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-identity] in 0.054 s  
> (103869)[0.211] DEBUG ziti-sdk:ziti\_ctrl.c:487 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] received 1/1 for paging request GET[/current-identity/edge-routers]  
> (103869)[0.211] DEBUG ziti-sdk:ziti\_ctrl.c:497 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed paging request GET[/current-identity/edge-routers] in 0.068 s  
> (103869)[0.211] INFO ziti-sdk:channel.c:265 new\_ziti\_channel() ch[0] (zpixr01) new channel for ztx[0] identity[45cb4a61-018d-4432-aff2-e0880b39687a.zpix]  
> (103869)[0.211] DEBUG ziti-sdk:channel.c:316 ziti\_channel\_set\_url() ch[0] setting channel[zpixr01] url[tls://zpixr01.vigitronic.eu:8442]  
> (103869)[0.211] INFO ziti-sdk:channel.c:836 reconnect\_channel() ch[0] reconnecting NOW  
> (103869)[0.211] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[channel.c:reconnect\_cb] timeout[0]  
> (103869)[0.212] DEBUG ziti-sdk:ziti.c:1740 ztx\_process\_deadlines() ztx[0] calling channel.c:reconnect\_cb(0x7f21d80e3650)  
> (103869)[0.212] DEBUG ziti-sdk:channel.c:802 reconnect\_cb() ch[0] connecting to tls://zpixr01.vigitronic.eu:8442  
> (103869)[0.212] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[channel.c:ch\_connect\_timeout] timeout[20000]  
> (103869)[0.225] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-api-session/service-updates] in 0.081 s  
> (103869)[0.225] DEBUG ziti-sdk:ziti\_ctrl.c:1106 ctrl\_paging\_req() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] starting paging request GET[/services?configTypes=all]  
> (103869)[0.239] DEBUG ziti-sdk:ziti\_ctrl.c:487 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] received 3/3 for paging request GET[/services?configTypes=all]  
> (103869)[0.239] DEBUG ziti-sdk:ziti\_ctrl.c:497 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed paging request GET[/services?configTypes=all] in 0.013 s  
> (103869)[0.239] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[ziti.c:refresh\_cb] timeout[60000]  
> (103869)[0.239] DEBUG ziti-sdk:ziti.c:1384 update\_services() ztx[0] sending service event initial[true] 3 added, 0 removed, 0 changed  
> (103869)[0.240] DEBUG ziti-sdk:zitilib.c:901 do\_ziti\_bind() requesting bind fd[13] to service[@2609]  
> (103869)[0.253] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/services/AqErEuQI8ZfkKZzPTaVvt/edge-routers] in 0.013 s  
> (103869)[0.253] DEBUG ziti-sdk:bind.c:273 list\_routers\_cb() server0.0 zpixr01/tls://zpixr01.vigitronic.eu:8442  
> (103869)[0.267] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed POST[/sessions] in 0.027 s  
> (103869)[0.267] DEBUG ziti-sdk:bind.c:136 process\_bindings() server0.0 checking router[zpixr01]  
> (103869)[0.267] DEBUG ziti-sdk:bind.c:139 process\_bindings() server0.0 router[zpixr01] is not connected  
> (103869)[0.267] DEBUG ziti-sdk:zitilib.c:883 on\_ziti\_bind() successfully bound fd[13] to service[2609]  
> (103869)[0.315] DEBUG ziti-sdk:channel.c:966 on\_tls\_connect() ch[0] connected alpn[ziti-edge]  
> (103869)[0.352] INFO ziti-sdk:channel.c:734 hello\_reply\_cb() ch[0] connected. EdgeRouter version: v1.6.6|207d28c6bdee|2025-07-25T17:21:06Z|linux|amd64  
> (103869)[0.352] DEBUG ziti-sdk:bind.c:136 process\_bindings() server0.0 checking router[zpixr01]  
> (103869)[0.352] DEBUG ziti-sdk:bind.c:537 start\_binding() server0.0 requesting BIND on ch[zpixr01]  
> (103869)[0.352] DEBUG ziti-sdk:bind.c:171 update\_bindings() server0.0 bindings: active[1] target[1]  
> (103869)[0.352] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[channel.c:send\_latency\_probe] timeout[60000]  
> (103869)[0.352] DEBUG ziti-sdk:deadline.h:38 clear\_deadline() expire\_cb[channel.c:ch\_connect\_timeout]  
> (103869)[0.366] DEBUG ziti-sdk:bind.c:508 bind\_reply\_cb() server0.0 bound successfully on router[zpixr01]  
> (103869)[0.366] DEBUG ziti-sdk:channel.c:238 ziti\_channel\_add\_receiver() ch[0] added receiver[0]

> **Client logs**
>
> (13118)[0.000] INFO ziti-sdk:utils.c:196 ziti\_log\_set\_level() set log level: root=4/DEBUG  
> (13118)[0.000] INFO ziti-sdk:utils.c:165 ziti\_log\_init() Ziti C SDK version 1.7.8 @g727c6bf(HEAD) starting at (2025-09-22T11:57:54.346)  
> (13118)[0.000] DEBUG ziti-sdk:zitilib.c:1056 looper() loop is starting  
> (13118)[0.009] DEBUG ziti-sdk:zitilib.c:230 load\_ziti\_ctx() loading identity from identity.json  
> (13118)[0.018] INFO ziti-sdk:ziti.c:512 ziti\_start\_internal() ztx[0] enabling Ziti Context  
> (13118)[0.018] INFO ziti-sdk:ziti.c:528 ziti\_start\_internal() ztx[0] using tlsuv[v0.37.1/OpenSSL 3.5.0 8 Apr 2025]  
> (13118)[0.018] INFO ziti-sdk:ziti\_ctrl.c:637 ziti\_ctrl\_init() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] controller initialized  
> (13118)[0.018] DEBUG ziti-sdk:ziti\_ctrl.c:648 ziti\_ctrl\_init() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] ziti controller client initialized  
> (13118)[0.018] INFO ziti-sdk:ziti.c:606 ztx\_init\_controller() ztx[0] Loading ziti context with controller[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)]  
> (13118)[0.018] DEBUG ziti-sdk:ziti.c:537 ziti\_start\_internal() ztx[0] using metrics interval: 0  
> (13118)[0.018] DEBUG ziti-sdk:ziti.c:226 ziti\_set\_unauthenticated() ztx[0] setting auth\_state[0] to 0  
> (13118)[0.018] DEBUG ziti-sdk:ziti\_ctrl.c:380 ziti\_ctrl\_clear\_api\_session() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] clearing api session token for ziti\_controller  
> (13118)[0.018] DEBUG ziti-sdk:ziti\_ctrl.c:1106 ctrl\_paging\_req() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] starting paging request GET[/external-jwt-signers]  
> (13118)[5.269] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/version] in 5.148 s  
> (13118)[5.269] INFO ziti-sdk:ziti.c:2038 version\_pre\_auth\_cb() ztx[0] connected to Legacy controller [https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1) version v1.6.6(207d28c6bdee 2025-07-25T17:21:06Z)  
> (13118)[5.270] DEBUG ziti-sdk:legacy\_auth.c:238 auth\_timer\_cb() refreshing session[(nil)]  
> (13118)[5.283] DEBUG ziti-sdk:ziti\_ctrl.c:487 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] received 0/0 for paging request GET[/external-jwt-signers]  
> (13118)[5.283] DEBUG ziti-sdk:ziti\_ctrl.c:497 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed paging request GET[/external-jwt-signers] in 5.161 s  
> (13118)[5.283] DEBUG ziti-sdk:ziti.c:664 ext\_jwt\_singers\_cb() ztx[0] 0 external auth providers available  
> (13118)[5.299] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed POST[/authenticate?method=cert] in 0.029 s  
> (13118)[5.299] DEBUG ziti-sdk:ziti\_ctrl.c:394 ctrl\_login\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] authenticated successfully session[cmfv2o34awtnaeldvln6gvlgy]  
> (13118)[5.299] DEBUG ziti-sdk:legacy\_auth.c:170 login\_cb() logged in successfully =\> api\_session[cmfv2o34awtnaeldvln6gvlgy]  
> (13118)[5.299] DEBUG ziti-sdk:ziti.c:381 ziti\_set\_fully\_authenticated() ztx[0] setting auth\_state[0] to 3  
> (13118)[5.299] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[ziti.c:refresh\_cb] timeout[0]  
> (13118)[5.299] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[posture.c:ziti\_pr\_ticker\_cb] timeout[1]  
> (13118)[5.299] DEBUG ziti-sdk:legacy\_auth.c:309 refresh\_delay() api session set based on session-\>expireSeconds, next refresh in 3540s  
> (13118)[5.300] DEBUG ziti-sdk:ziti.c:1740 ztx\_process\_deadlines() ztx[0] calling ziti.c:refresh\_cb(0x7f586c0059c0)  
> (13118)[5.300] DEBUG ziti-sdk:ziti\_ctrl.c:1106 ctrl\_paging\_req() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] starting paging request GET[/current-identity/edge-routers]  
> (13118)[5.301] DEBUG ziti-sdk:ziti.c:1740 ztx\_process\_deadlines() ztx[0] calling posture.c:ziti\_pr\_ticker\_cb(0x7f586c0059c0)  
> (13118)[5.301] INFO ziti-sdk:posture.c:206 ziti\_send\_posture\_data() ztx[0] first run or potential controller restart detected  
> (13118)[5.301] DEBUG ziti-sdk:posture.c:210 ziti\_send\_posture\_data() ztx[0] posture checks must\_send set to TRUE, new\_session\_id[TRUE], must\_send\_every\_time[TRUE], new\_controller\_instance[TRUE]  
> (13118)[5.301] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[posture.c:ziti\_pr\_ticker\_cb] timeout[20000]  
> (13118)[5.328] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-api-session] in 0.029 s  
> (13118)[5.328] DEBUG ziti-sdk:ziti\_ctrl.c:394 ctrl\_login\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] authenticated successfully session[cmfv2o34awtnaeldvln6gvlgy]  
> (13118)[5.328] DEBUG ziti-sdk:ziti.c:2235 api\_session\_cb() ztx[0] app is not requiring expiration check  
> (13118)[5.342] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-identity] in 0.043 s  
> (13118)[5.356] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-identity] in 0.056 s  
> (13118)[5.370] DEBUG ziti-sdk:ziti\_ctrl.c:487 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] received 1/1 for paging request GET[/current-identity/edge-routers]  
> (13118)[5.370] DEBUG ziti-sdk:ziti\_ctrl.c:497 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed paging request GET[/current-identity/edge-routers] in 0.070 s  
> (13118)[5.370] INFO ziti-sdk:channel.c:265 new\_ziti\_channel() ch[0] (zpixr01) new channel for ztx[0] identity[cbf38f5a-c04d-4204-b0ed-509ebdcd0662.zpix]  
> (13118)[5.370] DEBUG ziti-sdk:channel.c:316 ziti\_channel\_set\_url() ch[0] setting channel[zpixr01] url[tls://zpixr01.vigitronic.eu:8442]  
> (13118)[5.370] INFO ziti-sdk:channel.c:836 reconnect\_channel() ch[0] reconnecting NOW  
> (13118)[5.370] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[channel.c:reconnect\_cb] timeout[0]  
> (13118)[5.371] DEBUG ziti-sdk:ziti.c:1740 ztx\_process\_deadlines() ztx[0] calling channel.c:reconnect\_cb(0x7f586c0f3970)  
> (13118)[5.371] DEBUG ziti-sdk:channel.c:802 reconnect\_cb() ch[0] connecting to tls://zpixr01.vigitronic.eu:8442  
> (13118)[5.371] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[channel.c:ch\_connect\_timeout] timeout[20000]  
> (13118)[5.384] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed GET[/current-api-session/service-updates] in 0.084 s  
> (13118)[5.384] DEBUG ziti-sdk:ziti\_ctrl.c:1106 ctrl\_paging\_req() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] starting paging request GET[/services?configTypes=all]  
> (13118)[5.398] DEBUG ziti-sdk:ziti\_ctrl.c:487 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] received 2/2 for paging request GET[/services?configTypes=all]  
> (13118)[5.398] DEBUG ziti-sdk:ziti\_ctrl.c:497 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed paging request GET[/services?configTypes=all] in 0.013 s  
> (13118)[5.398] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[ziti.c:refresh\_cb] timeout[60000]  
> (13118)[5.398] DEBUG ziti-sdk:ziti.c:1384 update\_services() ztx[0] sending service event initial[true] 2 added, 0 removed, 0 changed  
> (13118)[5.399] DEBUG ziti-sdk:zitilib.c:1282 Ziti\_resolve() host[45cb4a61-018d-4432-aff2-e0880b39687a.zpix] port[2609]  
> (13118)[5.438] DEBUG ziti-sdk:zitilib.c:1197 resolve\_cb() resolving 45cb4a61-018d-4432-aff2-e0880b39687a.zpix  
> (13118)[5.438] DEBUG ziti-sdk:zitilib.c:542 find\_service() looking up 0:45cb4a61-018d-4432-aff2-e0880b39687a.zpix:2609  
> (13118)[5.438] DEBUG ziti-sdk:zitilib.c:1205 resolve\_cb() 45cb4a61-018d-4432-aff2-e0880b39687a.zpix:2609 =\> 2609  
> (13118)[5.438] DEBUG ziti-sdk:zitilib.c:1216 resolve\_cb() assigned 45cb4a61-018d-4432-aff2-e0880b39687a.zpix =\> 1004064  
> (13118)[5.439] DEBUG ziti-sdk:zitilib.c:628 do\_ziti\_connect() connecting fd[10] to 100.64.0.1:2609  
> (13118)[5.439] DEBUG ziti-sdk:zitilib.c:542 find\_service() looking up 1:45cb4a61-018d-4432-aff2-e0880b39687a.zpix:2609  
> (13118)[5.439] DEBUG ziti-sdk:zitilib.c:690 do\_ziti\_connect() connecting fd[10] to service[2609]  
> (13118)[5.439] DEBUG ziti-sdk:connect.c:431 connect\_get\_service\_cb() conn0.0/K5JaKomr/Connecting got service[2609] id[AqErEuQI8ZfkKZzPTaVvt]  
> (13118)[5.439] DEBUG ziti-sdk:posture.c:210 ziti\_send\_posture\_data() ztx[0] posture checks must\_send set to TRUE, new\_session\_id[FALSE], must\_send\_every\_time[TRUE], new\_controller\_instance[FALSE]  
> (13118)[5.439] DEBUG ziti-sdk:connect.c:527 process\_connect() conn0.0/K5JaKomr/Connecting requesting 'Dial' session for service[2609]  
> (13118)[10.491] DEBUG ziti-sdk:channel.c:966 on\_tls\_connect() ch[0] connected alpn[ziti-edge]  
> (13118)[10.512] DEBUG ziti-sdk:ziti\_ctrl.c:502 ctrl\_body\_cb() ctrl[[https://zpix.vigitronic.eu:8440/edge/client/v1](https://zpix.vigitronic.eu:8440/edge/client/v1)] completed POST[/sessions] in 5.073 s  
> (13118)[10.512] DEBUG ziti-sdk:connect.c:486 connect\_get\_net\_session\_cb() conn0.0/K5JaKomr/Connecting got session[cmfv2o754wtngeldv9xqroilr] for service[2609]  
> (13118)[10.512] DEBUG ziti-sdk:posture.c:210 ziti\_send\_posture\_data() ztx[0] posture checks must\_send set to TRUE, new\_session\_id[FALSE], must\_send\_every\_time[TRUE], new\_controller\_instance[FALSE]  
> (13118)[10.512] DEBUG ziti-sdk:connect.c:550 process\_connect() conn0.0/K5JaKomr/Connecting starting Dial connection for service[2609] with session[cmfv2o754wtngeldv9xqroilr]  
> (13118)[10.512] DEBUG ziti-sdk:connect.c:419 ziti\_connect() conn0.0/K5JaKomr/Connecting waiting for suitable channel  
> (13118)[10.512] DEBUG ziti-sdk:connect.c:552 process\_connect() conn0.0/K5JaKomr/Connecting no active edge routers, pending ER connection  
> (13118)[10.525] INFO ziti-sdk:channel.c:734 hello\_reply\_cb() ch[0] connected. EdgeRouter version: v1.6.6|207d28c6bdee|2025-07-25T17:21:06Z|linux|amd64  
> (13118)[10.525] DEBUG ziti-sdk:posture.c:210 ziti\_send\_posture\_data() ztx[0] posture checks must\_send set to TRUE, new\_session\_id[FALSE], must\_send\_every\_time[TRUE], new\_controller\_instance[FALSE]  
> (13118)[10.525] DEBUG ziti-sdk:connect.c:550 process\_connect() conn0.0/K5JaKomr/Connecting starting Dial connection for service[2609] with session[cmfv2o754wtngeldv9xqroilr]  
> (13118)[10.525] DEBUG ziti-sdk:connect.c:408 ziti\_connect() conn0.0/K5JaKomr/Connecting selected ch[zpixr01@tls://zpixr01.vigitronic.eu:8442] for best latency(18263536 ms)  
> (13118)[10.525] DEBUG ziti-sdk:channel.c:238 ziti\_channel\_add\_receiver() ch[0] added receiver[0]  
> (13118)[10.525] DEBUG ziti-sdk:ziti.c:1697 do\_ztx\_set\_deadline() ztx[0] expire\_cb[channel.c:send\_latency\_probe] timeout[60000]  
> (13118)[10.525] DEBUG ziti-sdk:deadline.h:38 clear\_deadline() expire\_cb[channel.c:ch\_connect\_timeout]  
> (13118)[10.539] ERROR ziti-sdk:connect.c:1068 connect\_reply\_cb() conn0.0/K5JaKomr/Connecting failed to connect, reason=service AqErEuQI8ZfkKZzPTaVvt has no terminators for instanceId 45cb4a61-018d-4432-aff2-e0880b39687a.zpix  
> (13118)[10.539] DEBUG ziti-sdk:connect.c:323 complete\_conn\_req() conn0.0/K5JaKomr/Disconnected Disconnected failed: connection is closed  
> (13118)[10.539] WARN ziti-sdk:zitilib.c:534 on\_ziti\_connect() failed to establish ziti connection: -24(connection is closed)  
> (13118)[10.539] DEBUG ziti-sdk:zitilib.c:508 on\_bridge\_close() closed conn for socket(10)  
> (13118)[10.539] DEBUG ziti-sdk:connect.c:893 flush\_to\_client() conn0.0/K5JaKomr/Closed no data\_cb: can't flush, 0 bytes available  
> (13118)[10.539] DEBUG ziti-sdk:connect.c:184 close\_conn\_internal() conn0.0/K5JaKomr/Closed removing  
> (13118)[10.539] DEBUG ziti-sdk:channel.c:247 ziti\_channel\_rem\_receiver() ch[0] removed receiver[0]  
> (13118)[10.539] DEBUG ziti-sdk:ziti.c:1691 grim\_reaper() ztx[0] reaped 1 closed (out of 1 total) connections

I would be very grateful for any input on this topic, I've been stuck on it for quite some time.

---

<div class="post-metadata">

**Author:** ![Mathis](https://avatars.discourse-cdn.com/v4/letter/m/278dde/32.png) [@Mathis](https://openziti.discourse.group/u/Mathis)\
**Post date:** [September 22, 2025, 12:23pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/2 "2025-09-22T12:23:48Z")

</div>

I forgot to also provide the python code for both side, here they are :

> **Host python code**
>
> ```auto
> from flask import Flask
> import openziti
> import sys
> 
> app = Flask( __name__ )
> bind_opts = {} # populated in main
> 
> @openziti.zitify(bindings={':2609': bind_opts,})
> def runApp():
> from waitress import serve
> print("starting server on OpenZiti overlay")
> #the port is only used to integrate OpenZiti with frameworks that expect a "hostname:port" combo
> serve(app,port=2609)
> 
> @app.route('/')
> def hello_world(): # put application's code here
> print("received a request to /")
> return 'Have some Ziti!'
> 
> @app.route('/json')
> def some_json(): # put application's code here
> print("received a request to /json")
> return '{"here":"is", "some":"json"}'
> 
> if __name__ == ' __main__':
> bind_opts['ztx'] = sys.argv[1]
> bind_opts['service'] = sys.argv[2]
> runApp()
> 
> ```
> 
> I run the app with "python3 test\_ziti.py "ziti/identity.json" "2609" "

> **Client's python code**
>
> ```auto
> import os
> import openziti
> import requests
> 
> ztx = openziti.load("identity.json")
> if ztx is None:
> raise RuntimeError("Identity load failed")
> 
> openziti.monkeypatch()
> 
> resp = requests.get("http://45cb4a61-018d-4432-aff2-e0880b39687a.zpix:2609/hello")
> print(resp.status_code)
> print(resp.text)
> 
> ```

---

<div class="post-metadata">

**Author:** ![scareything](https://yyz2.discourse-cdn.com/free1/user_avatar/openziti.discourse.group/scareything/32/106_2.png) [@scareything](https://openziti.discourse.group/u/scareything)\
**Post date:** [September 22, 2025, 1:16pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/3 "2025-09-22T13:16:52Z")

</div>

> [@Mathis](#):
>
> "dialOptions": {  
> "identity": "$dst\_hostname"  
> }

What’s the name of the OpenZiti identity that’s running the host app? I couldn’t tell from the logs. You probably know this, but when your host configuration sets `bindUsingEdgeIdentity`, clients will need to set `dialOptions.identity` to the name of the identity. If your identity is named after the hostname (fqdn) that you’re using to access it (e.g. “45cb4a61-018d-4432-aff2-e0880b39687  
a.zpix”) then it should be working.

It would be helpful to see the output of `ziti edge list terminators` while your host app is running if you have access to the controller.

---

<div class="post-metadata">

**Author:** ![Mathis](https://avatars.discourse-cdn.com/v4/letter/m/278dde/32.png) [@Mathis](https://openziti.discourse.group/u/Mathis)\
**Post date:** [September 22, 2025, 1:41pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/4 "2025-09-22T13:41:22Z")

</div>

Thanks for your answer,  
The host's identity name is "45cb4a61-018d-4432-aff2-e0880b39687  
a.zpix”, which is the address I try to dial from the client.

> [@scareything](#):
>
> If your identity is named after the hostname (fqdn) that you’re using to access it

By this do you mean the ziti hostname or the actual linux hostname ? The former is but not the latter

After listing the terminators there's none with that ID showing up. So the problem clearly seems to be host-side, but I don't see anything suspicious in the logs

---

<div class="post-metadata">

**Author:** ![scareything](https://yyz2.discourse-cdn.com/free1/user_avatar/openziti.discourse.group/scareything/32/106_2.png) [@scareything](https://openziti.discourse.group/u/scareything)\
**Post date:** [September 22, 2025, 2:15pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/5 "2025-09-22T14:15:46Z")

</div>

Yes, I’m referring to the ziti hostname.

fwiw it’s probably just a copy/paste artifact, but I noticed that your hosting identity name appears to have an embedded newline in the error message from the client.

Do any of your terminators for this service show an identity at all in the terminator list? It shouldn’t make a difference, but I wonder if setting `listenOptions.identity ` `$tunneler_id.name` would behave differently?

---

<div class="post-metadata">

**Author:** ![Mathis](https://avatars.discourse-cdn.com/v4/letter/m/278dde/32.png) [@Mathis](https://openziti.discourse.group/u/Mathis)\
**Post date:** [September 22, 2025, 2:36pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/6 "2025-09-22T14:36:51Z")

</div>

It is a copy/paste mistake, mb.

Yes there are currently 3 other terminators for this service, all showing up in the list. Though they're using the tunneler, the problematic one is the only one running the SDK.

Sorry I may be missing something fundamental, but I don’t quite understand what `$tunneler_id.name` refers to. And is it supposed to replace `bindUsingEdgeIdentity`?

---

<div class="post-metadata">

**Author:** ![ekoby](https://yyz2.discourse-cdn.com/free1/user_avatar/openziti.discourse.group/ekoby/32/14_2.png) [@ekoby](https://openziti.discourse.group/u/ekoby)\
**Post date:** [September 22, 2025, 3:02pm UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/7 "2025-09-22T15:02:15Z")

</div>

Python SDK does not looks at `host.v1` configuration. It would feel weird if it did.

`bind_opts` does support specifying terminator with a tuple like this

```auto
bind_opts["service"] = serviceName, terminator

```

Does it help at all?

---

<div class="post-metadata">

**Author:** ![Mathis](https://avatars.discourse-cdn.com/v4/letter/m/278dde/32.png) [@Mathis](https://openziti.discourse.group/u/Mathis)\
**Post date:** [September 23, 2025, 6:49am UTC](https://openziti.discourse.group/t/service-has-no-terminators-error-using-python-sdk/5131/8 "2025-09-23T06:49:36Z")

</div>

Thanks, that was it! By adding the terminator's name in bind\_opts like this :

```auto
bind_opts['service'] = ("2609", "45cb4a61-018d-4432-aff2-e0880b39687a.zpix")

```

I am now able to dial it from the client with no issue.  
Thanks for your help
