<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Duo /admin/v2/integrations API Call Not Working in APIs</title>
    <link>https://community.cisco.com/t5/apis/duo-admin-v2-integrations-api-call-not-working/m-p/5136085#M791</link>
    <description>&lt;P&gt;&lt;SPAN&gt;@Duo @DuoSecurity&lt;BR /&gt;&lt;BR /&gt;We are trying to figure out why calling /admin/v1/integrations via the official Golang API client works, but /admin/v2/integrations does not. Unfortunately, Duo support staff are struggling to help. Does anyone have experience, or an example (in any programming language) of this working? More details below, thanks in advance.&lt;BR /&gt;&lt;BR /&gt;We have the Golang API client connected to our internal API we are building, we are able to get users and integrations from v1 endpoints but we are struggling with 40103 errors when using /admin/v2/integrations endpoints.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This is a working code snippet, how do I change this to work with v2 endpoints? This is set up nearly identical to the user and group methods in the Golang API client repo Duo recommends to use.&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV class=""&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;func&lt;/SPAN&gt; (&lt;SPAN&gt;c &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;Client&lt;/SPAN&gt;) &lt;SPAN&gt;GetIntegrations&lt;/SPAN&gt;(&lt;SPAN&gt;options&lt;/SPAN&gt; &lt;SPAN&gt;...func&lt;/SPAN&gt;(&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;)) (&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;, &lt;SPAN&gt;error&lt;/SPAN&gt;) {&lt;/DIV&gt;&lt;DIV&gt;params &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;{}&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for&lt;/SPAN&gt; _, o &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;range&lt;/SPAN&gt; options {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;o&lt;/SPAN&gt;(&lt;SPAN&gt;&amp;amp;&lt;/SPAN&gt;params)&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;cb &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;func&lt;/SPAN&gt;(&lt;SPAN&gt;params&lt;/SPAN&gt; &lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;) (&lt;SPAN&gt;responsePage&lt;/SPAN&gt;, &lt;SPAN&gt;error&lt;/SPAN&gt;) {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; c.&lt;SPAN&gt;retrieveIntegrations&lt;/SPAN&gt;(params)&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;response, err &lt;SPAN&gt;:=&lt;/SPAN&gt; c.&lt;SPAN&gt;retrieveItems&lt;/SPAN&gt;(params, cb)&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; err &lt;SPAN&gt;!=&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt; {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt;, err&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; response.(&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;), &lt;SPAN&gt;nil&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;func&lt;/SPAN&gt; (&lt;SPAN&gt;c &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;Client&lt;/SPAN&gt;) &lt;SPAN&gt;retrieveIntegrations&lt;/SPAN&gt;(&lt;SPAN&gt;params&lt;/SPAN&gt; &lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;) (&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;, &lt;SPAN&gt;error&lt;/SPAN&gt;) {&lt;/DIV&gt;&lt;DIV&gt;_, body, err &lt;SPAN&gt;:=&lt;/SPAN&gt; c.&lt;SPAN&gt;SignedCall&lt;/SPAN&gt;(http.MethodGet, &lt;SPAN&gt;"/admin/v1/integrations"&lt;/SPAN&gt;, params, UseTimeout)&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; err &lt;SPAN&gt;!=&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt; {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt;, err&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;result &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;{}&lt;/DIV&gt;&lt;DIV&gt;err &lt;SPAN&gt;=&lt;/SPAN&gt; json.&lt;SPAN&gt;Unmarshal&lt;/SPAN&gt;(body, result)&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; err &lt;SPAN&gt;!=&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt; {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&amp;nbsp;nil, err&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; result, &lt;SPAN&gt;nil&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;We do not understand what is wrong. This works with v1, but not v2. Other user and group methods seem to work either way.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I also noticed this in the duosecurity/duo_client_python/duo_client/admin.py,&amp;nbsp;on line 2595. Is this perhaps why it is not working? We need to use SSO params in the call so v2 is required.&lt;BR /&gt;&lt;BR /&gt;&lt;BLOCKQUOTE&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sso - &amp;lt;dict: parameters for generic single sign-on&amp;gt; (optional)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; New argument for unreleased feature. Will return an error if used.&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Client will be updated again in the future when feature is released.&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Wed, 26 Jun 2024 01:37:58 GMT</pubDate>
    <dc:creator>pwilliams-ck</dc:creator>
    <dc:date>2024-06-26T01:37:58Z</dc:date>
    <item>
      <title>Duo /admin/v2/integrations API Call Not Working</title>
      <link>https://community.cisco.com/t5/apis/duo-admin-v2-integrations-api-call-not-working/m-p/5136085#M791</link>
      <description>&lt;P&gt;&lt;SPAN&gt;@Duo @DuoSecurity&lt;BR /&gt;&lt;BR /&gt;We are trying to figure out why calling /admin/v1/integrations via the official Golang API client works, but /admin/v2/integrations does not. Unfortunately, Duo support staff are struggling to help. Does anyone have experience, or an example (in any programming language) of this working? More details below, thanks in advance.&lt;BR /&gt;&lt;BR /&gt;We have the Golang API client connected to our internal API we are building, we are able to get users and integrations from v1 endpoints but we are struggling with 40103 errors when using /admin/v2/integrations endpoints.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This is a working code snippet, how do I change this to work with v2 endpoints? This is set up nearly identical to the user and group methods in the Golang API client repo Duo recommends to use.&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV class=""&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;func&lt;/SPAN&gt; (&lt;SPAN&gt;c &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;Client&lt;/SPAN&gt;) &lt;SPAN&gt;GetIntegrations&lt;/SPAN&gt;(&lt;SPAN&gt;options&lt;/SPAN&gt; &lt;SPAN&gt;...func&lt;/SPAN&gt;(&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;)) (&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;, &lt;SPAN&gt;error&lt;/SPAN&gt;) {&lt;/DIV&gt;&lt;DIV&gt;params &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;{}&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for&lt;/SPAN&gt; _, o &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;range&lt;/SPAN&gt; options {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;o&lt;/SPAN&gt;(&lt;SPAN&gt;&amp;amp;&lt;/SPAN&gt;params)&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;cb &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;func&lt;/SPAN&gt;(&lt;SPAN&gt;params&lt;/SPAN&gt; &lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;) (&lt;SPAN&gt;responsePage&lt;/SPAN&gt;, &lt;SPAN&gt;error&lt;/SPAN&gt;) {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; c.&lt;SPAN&gt;retrieveIntegrations&lt;/SPAN&gt;(params)&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;response, err &lt;SPAN&gt;:=&lt;/SPAN&gt; c.&lt;SPAN&gt;retrieveItems&lt;/SPAN&gt;(params, cb)&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; err &lt;SPAN&gt;!=&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt; {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt;, err&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; response.(&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;), &lt;SPAN&gt;nil&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;func&lt;/SPAN&gt; (&lt;SPAN&gt;c &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;Client&lt;/SPAN&gt;) &lt;SPAN&gt;retrieveIntegrations&lt;/SPAN&gt;(&lt;SPAN&gt;params&lt;/SPAN&gt; &lt;SPAN&gt;url&lt;/SPAN&gt;.&lt;SPAN&gt;Values&lt;/SPAN&gt;) (&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;, &lt;SPAN&gt;error&lt;/SPAN&gt;) {&lt;/DIV&gt;&lt;DIV&gt;_, body, err &lt;SPAN&gt;:=&lt;/SPAN&gt; c.&lt;SPAN&gt;SignedCall&lt;/SPAN&gt;(http.MethodGet, &lt;SPAN&gt;"/admin/v1/integrations"&lt;/SPAN&gt;, params, UseTimeout)&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; err &lt;SPAN&gt;!=&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt; {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt;, err&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;result &lt;SPAN&gt;:=&lt;/SPAN&gt; &lt;SPAN&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN&gt;GetIntegrationsResult&lt;/SPAN&gt;{}&lt;/DIV&gt;&lt;DIV&gt;err &lt;SPAN&gt;=&lt;/SPAN&gt; json.&lt;SPAN&gt;Unmarshal&lt;/SPAN&gt;(body, result)&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; err &lt;SPAN&gt;!=&lt;/SPAN&gt; &lt;SPAN&gt;nil&lt;/SPAN&gt; {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&amp;nbsp;nil, err&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; result, &lt;SPAN&gt;nil&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;We do not understand what is wrong. This works with v1, but not v2. Other user and group methods seem to work either way.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I also noticed this in the duosecurity/duo_client_python/duo_client/admin.py,&amp;nbsp;on line 2595. Is this perhaps why it is not working? We need to use SSO params in the call so v2 is required.&lt;BR /&gt;&lt;BR /&gt;&lt;BLOCKQUOTE&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sso - &amp;lt;dict: parameters for generic single sign-on&amp;gt; (optional)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; New argument for unreleased feature. Will return an error if used.&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Client will be updated again in the future when feature is released.&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Wed, 26 Jun 2024 01:37:58 GMT</pubDate>
      <guid>https://community.cisco.com/t5/apis/duo-admin-v2-integrations-api-call-not-working/m-p/5136085#M791</guid>
      <dc:creator>pwilliams-ck</dc:creator>
      <dc:date>2024-06-26T01:37:58Z</dc:date>
    </item>
    <item>
      <title>Re: Duo /admin/v2/integrations API Call Not Working</title>
      <link>https://community.cisco.com/t5/apis/duo-admin-v2-integrations-api-call-not-working/m-p/5137955#M792</link>
      <description>&lt;P&gt;Not trying to hijack your thread but I have issues with integrations v2 as well using Python client and I'm experiencing the same poor support from Duo.&amp;nbsp; The don't read the notes you put in the case.&amp;nbsp; In my case, the call works but does not return correct results.&amp;nbsp; I'm simply trying to list all integrations and it does not list any integrations using Duo SSO.&amp;nbsp; Here's my small code sample:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;import duo_client

ikey = "xxxxxx"
skey = "yyyyyy"
hostname = "api-zzzzzzz.duosecurity.com"

testadmin = duo_client.Admin(ikey=ikey, skey=skey, host=hostname)

integrations = testadmin.get_integrations()
for integration in integrations:
    print(integration) &lt;/LI-CODE&gt;</description>
      <pubDate>Sat, 29 Jun 2024 15:45:56 GMT</pubDate>
      <guid>https://community.cisco.com/t5/apis/duo-admin-v2-integrations-api-call-not-working/m-p/5137955#M792</guid>
      <dc:creator>dwrice000</dc:creator>
      <dc:date>2024-06-29T15:45:56Z</dc:date>
    </item>
    <item>
      <title>Re: Duo /admin/v2/integrations API Call Not Working</title>
      <link>https://community.cisco.com/t5/apis/duo-admin-v2-integrations-api-call-not-working/m-p/5138522#M793</link>
      <description>&lt;P&gt;SOLUTION: Use v5 signing when making requests. The JSONSignedCall function uses v5. Here is the pull request.&lt;/P&gt;&lt;P&gt;&lt;A href="https://github.com/duosecurity/duo_api_golang/pull/48" target="_blank" rel="noopener noreferrer"&gt;https://github.com/duosecurity/duo_api_golang/pull/48&lt;/A&gt;&lt;/P&gt;&lt;P&gt;To use v5 signatures, you need to convert their params from type&amp;nbsp;url.values&amp;nbsp;to&amp;nbsp;JSONParams.&lt;/P&gt;&lt;PRE&gt;    params := duoapi.JSONParams{}
	params["offset"] = "5"
	_, body, err := api.JSONSignedCall(http.MethodGet, "/admin/v2/integrations", params)
	if err != nil {
		println("Error")
		return
	}

	v2Result := &amp;amp;GetIntegrationsResult{}
	err = json.Unmarshal(body, v2Result)
	if err != nil {
		println("Error")
		return
	}

	fmt.Printf("%+v", *v2Result)&lt;/PRE&gt;&lt;P&gt;---&lt;/P&gt;&lt;P&gt;Reply to dwrice000:&lt;/P&gt;&lt;P&gt;You are not hijacking, I was having the exact same problem. The documentation is very lackluster and outdated, I am building some automation with their Golang Client, and I figured it out mostly.&lt;/P&gt;&lt;P&gt;Maybe you are not seeing the SSO integrations because you need to use v2 Admin API endpoints, not v1. In order to use v2 Admin API endpoints you need to use the v5 signing function. I know it's confusing but their authentication signing is on a different version schema. I really hate their documentation on this, it needs to be fixed.&lt;/P&gt;&lt;P&gt;I am using the Golang client so I don't have time to go back through the Python code but I believe I saw that there is logic to check if you are using v1 or v2 endpoints when you call the API. So I believe if you use v5 signing with v2 endpoints, you should be good.&lt;/P&gt;&lt;P&gt;You also need the correct permissions with the Admin API you are calling, perhaps that is why you can not see SSO params. You can change that quickly in the GUI. Also, what error codes and messages are you getting?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 01 Jul 2024 21:48:26 GMT</pubDate>
      <guid>https://community.cisco.com/t5/apis/duo-admin-v2-integrations-api-call-not-working/m-p/5138522#M793</guid>
      <dc:creator>pwilliams-ck</dc:creator>
      <dc:date>2024-07-01T21:48:26Z</dc:date>
    </item>
  </channel>
</rss>

