<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.blackboard.com/blog</id>
    <title>Blackboard Developer Docs Blog</title>
    <updated>2024-11-01T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.blackboard.com/blog"/>
    <subtitle>Blackboard Developer Docs Blog</subtitle>
    <icon>https://docs.blackboard.com/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Changes to Assignments With Blackboard 3900.98]]></title>
        <id>https://docs.blackboard.com/blog/changes-to-assignments-blackboard-3900.98</id>
        <link href="https://docs.blackboard.com/blog/changes-to-assignments-blackboard-3900.98"/>
        <updated>2024-11-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We are writing this blog post to document a change to how REST APIs work with Ultra Assignments and Tests. Previously, before Blackboard version 3900.98, you could use the createAssignment REST API and treat the resulting object like a Test. You could add more than one question of differing types, using the user interface. You could use the REST API and add more than one presentation-type question type using POST request to /learn/api/public/v1/courses/[courseId]/assessments/[assessmentId]/questions/[questionId].]]></summary>
        <content type="html"><![CDATA[<p>We are writing this blog post to document a change to how REST APIs work with Ultra Assignments and Tests. Previously, before Blackboard version 3900.98, you could use the createAssignment REST API and treat the resulting object like a Test. You could add more than one question of differing types, using the user interface. You could use the REST API and add more than one presentation-type question type using POST request to /learn/api/public/v1/courses/[courseId]/assessments/[assessmentId]/questions/[questionId].</p>
<p><a href="https://help.blackboard.com/Learn/Administrator/SaaS/Release_Notes/Archived_Release_Notes#3900.98.0-6" target="_blank" rel="noopener noreferrer" class="">Blackboard introduced a new Assignment tool with version 3900.98.</a> It is no longer the same as a Test. With the new Assignment tool, when you use createAssignment the assignment body is still created, but you only see the instructions, with no option to add questions, and you cannot add questions using the assessments endpoint. To create a Test you must now use the createContent endpoint. You can find more information here: <a class="" href="https://docs.blackboard.com/docs/blackboard/rest-apis/hands-on/creating-content-with-rest-apis">Creating and Updating Content with REST APIs</a>.</p>]]></content>
        <author>
            <name>Mark Kauffman</name>
        </author>
        <category label="Assignments" term="Assignments"/>
        <category label="Tests" term="Tests"/>
        <category label="Integrations" term="Integrations"/>
        <category label="Partners" term="Partners"/>
        <category label="Developers" term="Developers"/>
        <category label="Community" term="Community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Public Rest API and devportal roadmap April 2024]]></title>
        <id>https://docs.blackboard.com/blog/public-rest-api-and-dev-portal-roadmap-april-2024</id>
        <link href="https://docs.blackboard.com/blog/public-rest-api-and-dev-portal-roadmap-april-2024"/>
        <updated>2024-04-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Owr very own Camilo Dominguez presented us on our bbtechies session on Wednesday April 17th 2024 the Public REST API roadmap and a bit of the Developer Portal Roadmap.]]></summary>
        <content type="html"><![CDATA[<p>Owr very own Camilo Dominguez presented us on our bbtechies session on Wednesday April 17th 2024 the Public REST API roadmap and a bit of the Developer Portal Roadmap.</p>
<iframe width="100%" height="600" src="https://www.youtube.com/embed/xXb89AsDb10?si=myr1kSJg0dBNPZnv" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<p>Here is the slide deck!</p>
<object data="/assets/files/Public_REST_API_Roadmap_april_2024.pdf" width="100%" height="600" type="application/pdf"></object>
<p>Cheers!</p>]]></content>
        <author>
            <name>Camilo Dominguez</name>
        </author>
        <category label="bestpractices" term="bestpractices"/>
        <category label="Integrations" term="Integrations"/>
        <category label="Partners" term="Partners"/>
        <category label="Developers" term="Developers"/>
        <category label="Community" term="Community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Best Practices - Requesting Support via email]]></title>
        <id>https://docs.blackboard.com/blog/email-support-best-practices</id>
        <link href="https://docs.blackboard.com/blog/email-support-best-practices"/>
        <updated>2024-03-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Ensuring prompt email support is crucial for achieving a seamless integration. We prioritize addressing inquiries from developers and the community promptly. However, given the volume of emails we receive daily, ranging from straightforward queries to those requiring in-depth research for the best solution or alternative, our response times may vary. Our approach to supporting email inquiries involves several phases:]]></summary>
        <content type="html"><![CDATA[<p>Ensuring prompt email support is crucial for achieving a seamless integration. We prioritize addressing inquiries from developers and the community promptly. However, given the volume of emails we receive daily, ranging from straightforward queries to those requiring in-depth research for the best solution or alternative, our response times may vary. Our approach to supporting email inquiries involves several phases:</p>
<p>Upon receipt, emails undergo the following process:</p>
<ul>
<li class="">The developer support team identifies the relevant domain associated with the request, such as Learn, Student, Reach, Finance, etc.</li>
<li class="">The support request is then assigned to the most suitable resource available.</li>
<li class="">Extensive research is conducted on the issue outlined in the email.</li>
<li class="">A comprehensive response is crafted and sent out to address the email.</li>
</ul>
<p>Below are the recommended best practices to ensure you receive the quickest, most accurate, and highest quality response:</p>
<ul>
<li class="">
<p>Ensure a Clear Subject Line:</p>
<ul>
<li class="">Opt for a descriptive subject line summarizing the issue concisely. We recommend using the following format:<!-- -->
<ul>
<li class="">[Your Company Name] - [Domain Name]: [Brief Issue Description]</li>
<li class="">Example: YourCompanyName-BlackboardLMS: Issue with Launching Textbook Tool</li>
</ul>
</li>
</ul>
</li>
<li class="">
<p>Provide Relevant Information:</p>
<ul>
<li class="">Include all necessary details such as issue specifics, steps to replicate, and relevant test data.</li>
</ul>
</li>
<li class="">
<p>Be Concise Yet Specific:</p>
<ul>
<li class="">Offer sufficient information to clarify the problem while avoiding unnecessary details that could potentially confuse the support team.</li>
</ul>
</li>
<li class="">
<p>One Issue per Email:</p>
<ul>
<li class="">Focus on one problem per email to streamline communication and ensure adequate attention is given to each issue.</li>
</ul>
</li>
<li class="">
<p>Maintain a Polite and Professional Tone:</p>
<ul>
<li class="">Uphold a respectful demeanor in your communication, regardless of any frustrations. Remember, support agents are here to assist you, and a courteous approach can enhance the interaction.</li>
</ul>
</li>
<li class="">
<p>Follow Up Appropriately:</p>
<ul>
<li class="">Should you not receive a response within a reasonable timeframe, consider a polite follow-up. However, refrain from overwhelming the support team with numerous emails in quick succession.</li>
</ul>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Email Support Process" src="https://docs.blackboard.com/assets/images/emailsupportprocess-0b9c6749bcd0af95dca955e299c42a12.png" width="634" height="362" class="img_ev3q"></p>
<p>We eagerly anticipate receiving full support and collaborating with your teams to ensure a successful integration.</p>
<p>Cheers!</p>]]></content>
        <author>
            <name>Vikas Gupta</name>
        </author>
        <category label="bestpractices" term="bestpractices"/>
        <category label="Integrations" term="Integrations"/>
        <category label="Partners" term="Partners"/>
        <category label="Developers" term="Developers"/>
        <category label="Community" term="Community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[REST APIs and Developer portal Roadmap DEC 13]]></title>
        <id>https://docs.blackboard.com/blog/rest-apis-and-developer-portal-roadmap-december-13-session</id>
        <link href="https://docs.blackboard.com/blog/rest-apis-and-developer-portal-roadmap-december-13-session"/>
        <updated>2023-12-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we had a really nice session with Mark O'Neil where he explored our roadmap for REST APIs and Developer Portal!]]></summary>
        <content type="html"><![CDATA[<p>Today, we had a really nice session with Mark O'Neil where he explored our roadmap for REST APIs and Developer Portal!</p>
<p>Have a glimpse of what's to come!</p>
<blockquote>
<p>our forward looking statement must be kept in mind in this presentation</p>
</blockquote>
<iframe width="100%" height="600" src="https://www.youtube.com/embed/jWmD115FJrs?si=dt5U5hBKJYHyG2oi" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<p>Here is the slide deck!</p>
<object data="/assets/files/developer_portal_roadmap_dec_23_deck.pdf" width="100%" height="600" type="application/pdf"></object>
<p>Cheers!</p>]]></content>
        <author>
            <name>Mark O'Neil</name>
        </author>
        <category label="roadmap" term="roadmap"/>
        <category label="Integrations" term="Integrations"/>
        <category label="Partners" term="Partners"/>
        <category label="Developers" term="Developers"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[REST APIs and Developer portal Roadmap August 30th 2023 session]]></title>
        <id>https://docs.blackboard.com/blog/rest-apis-and-developer-portal-roadmap-august-30-2023</id>
        <link href="https://docs.blackboard.com/blog/rest-apis-and-developer-portal-roadmap-august-30-2023"/>
        <updated>2023-08-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Today, we had a really nice session with Mark O'Neil where he explored our roadmap for REST APIs and Developer Portal!]]></summary>
        <content type="html"><![CDATA[<p>Today, we had a really nice session with Mark O'Neil where he explored our roadmap for REST APIs and Developer Portal!</p>
<p>Have a glimpse of what's to come!</p>
<blockquote>
<p>our forward looking statement must be kept in mind in this presentation</p>
</blockquote>
<iframe width="100%" height="600" src="https://www.youtube.com/embed/ovz03bYIDsc?si=RuzLwSoUHFKl2qLs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<p>Here is the slide deck!</p>
<object data="/assets/files/2023-08-30-restapi-amd-devportal-roadmap.pdf" width="100%" height="600" type="application/pdf"></object>
<p>Cheers!</p>]]></content>
        <author>
            <name>Mark O'Neil</name>
        </author>
        <category label="roadmap" term="roadmap"/>
        <category label="Integrations" term="Integrations"/>
        <category label="Partners" term="Partners"/>
        <category label="Developers" term="Developers"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Integration Installation and Customer Experience]]></title>
        <id>https://docs.blackboard.com/blog/Blackboard Integrations and Customer Experience</id>
        <link href="https://docs.blackboard.com/blog/Blackboard Integrations and Customer Experience"/>
        <updated>2023-05-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Blackboard has designed it's model for integrations in a manner which, when executed following our best practices, improves the Customer Integration Experience. Our goals in this area are multi-fold, yet all drive toward the best experience possible when Customers license, purchase, or develop integrations for enhancing their Blackboard Products as campus differentiators and enablers in achieving their Teaching and Learning objectives for their Staff, Faculty, and Students.]]></summary>
        <content type="html"><![CDATA[<p>Blackboard has designed it's model for integrations in a manner which, when executed following our best practices, improves the Customer Integration Experience. Our goals in this area are multi-fold, yet all drive toward the best experience possible when Customers license, purchase, or develop integrations for enhancing their Blackboard Products as campus differentiators and enablers in achieving their Teaching and Learning objectives for their Staff, Faculty, and Students.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-is-customer-experience-important">Why is Customer Experience Important?<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#why-is-customer-experience-important" class="hash-link" aria-label="Direct link to Why is Customer Experience Important?" title="Direct link to Why is Customer Experience Important?" translate="no">​</a></h2>
<p>Customer experience is important for Partners and Blackboard Customers for many reasons. Most notably:</p>
<p><strong>Customer Retention</strong>: Providing a positive customer experience can help improve customer retention rates. Customers are more likely to remain loyal to a brand if they have had a positive experience with the company.</p>
<p><strong>Brand Reputation</strong>: A positive customer experience can enhance your company's reputation and help build a positive brand image. Word of mouth and online reviews are powerful marketing tools, and customers are more likely to share their positive experiences with others.</p>
<p><strong>Competitive Advantage</strong>: Providing a superior customer experience can set a business apart from its competitors and give it a competitive advantage.</p>
<p>Overall, a positive customer experience is essential for building strong customer relationships, increasing customer loyalty, and improving the overall success of a business. This applies to our developer community as well as Blackboard.</p>
<p>In addition to the general integration functionality, for which the integration development team is ultimately responsible, the most significant impact on the Customer Experience is installation and support of your integration.</p>
<p>Installation of your integration is often the first experience customers will have with your business and first impressions are lasting and influence future interactions.</p>
<p>How clients discover and know whom to contact for Support is also a significant influencer of impressions of your business.</p>
<p>Blackboard has built our integration experience and best practices, with these latter two concepts in mind.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-installation">Integration Installation<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#integration-installation" class="hash-link" aria-label="Direct link to Integration Installation" title="Direct link to Integration Installation" translate="no">​</a></h2>
<p>Blackboard has thought long about how to simplify the integration experience for customers in the world of SaaS. In doing so we arrived at a "Register once, deploy everywhere" model for Integration developers to deliver theirr solutions. This applies to LTI 1.3 and RESTful integrations alike, and greatly simplifies installation for our mutual customers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="saas-changed-everything">SaaS changed everything...<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#saas-changed-everything" class="hash-link" aria-label="Direct link to SaaS changed everything..." title="Direct link to SaaS changed everything..." translate="no">​</a></h3>
<p>In prior years you may have built integrations which ran on-prem or in-process alongside the Blackboard product. This required customers to manage the software themselves. Under the more modern SaaS model, which is used by Blackboard, the customer is no responsible for updating and maintaining the integration, as SaaS product consumers receive updates automatically.</p>
<p>To facilitate the SaaS model, the Blackboard Developer Portal provides the means for you the Developer to register your integration once and deploy to multiple customers. Once your integration is registered in the Developer Portal an identifier is issued - this identifier is used by <em>all customers</em> to install your integration.</p>
<p>This means you have one instance of your integration and all customers use that instance. This of course imply some design concepts for your integration.</p>
<p>This model for delivering innovative solutions to customers provides cost savings and improved efficiency for your business. This is because instead of multiple instances (with per instance charges accrued) you only <em>need</em> one instance of your integration which is shared by all your customers. This is the SaaS way.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-design-considerations">Integration Design Considerations<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#integration-design-considerations" class="hash-link" aria-label="Direct link to Integration Design Considerations" title="Direct link to Integration Design Considerations" translate="no">​</a></h3>
<p>Register once and Deploy anywhere means there are some differences in how you design and deliver your integration.</p>
<blockquote>
<p>Note: The following pertains to development of integrations which are marketed to multiple customers. Only point 1 is pertinent to those who are developing campus-only solutions.</p>
</blockquote>
<ol>
<li class=""><strong>Logs and data</strong>: Integrations should maintain archives of customer logs and any integration specific data as those are not provided by Blackboard products.</li>
<li class=""><strong>Multi-tenancy</strong>: Integrations should follow a multi-tenant model vs single tenant. Multi-tenant means one integration service delivering your integration to all your customers vs requiring a new intetegration service per customer. This means you have to design into your integration the ability for enabling individual customer accounts, likely only administrator, for any customer specific configuration.</li>
<li class=""><strong>Separation of Customer data</strong>: Multi-tenancy means that in addition to running a single service for your customers you are likely using a single database. This dictates a secure separation of customer data using a unique customer identifier prefix on customer-centric data keys.</li>
</ol>
<p>Each of the above enable you to deliver a secure, efficient, and postive experience to customers at a cost savings of single instance vs multiple instance service delivery.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best Practices<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#best-practices" class="hash-link" aria-label="Direct link to Best Practices" title="Direct link to Best Practices" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="developer-portal-accounts">Developer Portal Accounts<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#developer-portal-accounts" class="hash-link" aria-label="Direct link to Developer Portal Accounts" title="Direct link to Developer Portal Accounts" translate="no">​</a></h4>
<p>There are really two <em>types</em> of Developer Portal accounts:</p>
<ol>
<li class="">Developer Accounts: the personal accounts which are used for prototyping and testing of your integration. These are in the form of developer<em><a href="mailto:name@domain.tld" target="_blank" rel="noopener noreferrer" class="">name@domain.tld</a>. These are often referred to as test or development _groups</em>. These groups are restricted in the number of request which may be made w/in a 24 hour time period to non-production level settings.</li>
<li class="">Production Accounts: these are your accounts used for production release of your integration. Given this account's information is what customers see when they install your integration it is considered a best practice to use a mailinglist such as business@, integration_name@, or <a href="mailto:support@domain.tld" target="_blank" rel="noopener noreferrer" class="">support@domain.tld</a>. This email must be publicly reachable.</li>
<li class="">Production Group: This is a very specific group within your Production Account which contains your integrations. This group receives production level settings.</li>
</ol>
<p>See <a href="https://docs.anthology.com/docs/developer-portal/community-dev_portal" target="_top">Getting Started with the Developer Portal</a> for more information.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="production-integration-release">Production Integration Release<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#production-integration-release" class="hash-link" aria-label="Direct link to Production Integration Release" title="Direct link to Production Integration Release" translate="no">​</a></h4>
<p>See our <a href="https://docs.anthology.com/docs/rest-apis/learn/getting-started/rest_apis-learn-getting-started-releasing_integration" target="_top">Releasing your Integration</a> guide for production release details.</p>
<p>Also see <a href="https://docs.anthology.com/docs/lti/lti-registration-deployment" target="_top">LTI Registration and Deployment with Learn</a> guide which describes Blackboard's approach behind releasing LTI 1.3 integrations.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="customer-facing-documentation">Customer Facing Documentation<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#customer-facing-documentation" class="hash-link" aria-label="Direct link to Customer Facing Documentation" title="Direct link to Customer Facing Documentation" translate="no">​</a></h4>
<p>It is the integration developer's responsibility to provide the necessary documentation for a successful installation. This is greatly simplified when following our best practices for Register once, deploy anywhere.</p>
<p>Currently there are three things which will generate no end of consternation for customers which degrades their experience with your integration/company. These three things fall into two groups User Roles and Support.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-user-roles-entitlements-vs-privileges">Integration User Roles: Entitlements vs Privileges<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#integration-user-roles-entitlements-vs-privileges" class="hash-link" aria-label="Direct link to Integration User Roles: Entitlements vs Privileges" title="Direct link to Integration User Roles: Entitlements vs Privileges" translate="no">​</a></h5>
<p>Aside from it <strong><em>not</em></strong> being a best practice to ask your customer to register your integration on the Developer Portal on your behalf, even worse is asking them to do so and then ask that they give your integration an Admin Role. <em>Never, never, never</em> ask them to do these terrible things.</p>
<p>Instead, develop your integration following the Register once model, and hand off your integration Identifier to your customer. If you are an LTI 1.3 provider - you are done. Your customer adds your LTI integration and sets availability to their users and they are done. No passing around of Keys and Secrets or error prone multiple copy pasting of multiple configuration strings... you hand off one integration Id which you get when you register your integration on the portal and done.</p>
<p>Well almost... the current exception (see The Future is Bright(er) below) is if your integration uses our REST APIs. Then your integration documentation must provide Blackboard administrators with a list of privileges that need to be added to the user which is associated with your integration. The APIs list entitlements, not privileges, and therein lay a problem for Customers.</p>
<p>As the integration provider you want a great customer experience so you use the <a href="https://docs.anthology.com/docs/rest-apis/learn/admin/rest_apis-learn-admin-rest_and_learn#converting-entitlements-to-gui-privileges" target="_top"> bookmarklet tool</a> to determine the privileges you include in your documentation to provide guidance to admins installing your integration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-support">Integration Support<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#integration-support" class="hash-link" aria-label="Direct link to Integration Support" title="Direct link to Integration Support" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="who-is-responsible-for-your-integrations-support">Who is responsible for your integration's support?<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#who-is-responsible-for-your-integrations-support" class="hash-link" aria-label="Direct link to Who is responsible for your integration's support?" title="Direct link to Who is responsible for your integration's support?" translate="no">​</a></h3>
<p>It probably goes without saying, but the integration vendor is responsible. Not Blackboard.</p>
<p>When the vendor registers in the Developer Portal they provide email information which is seen by customers when they install the integration. That is why this email and contact information must be publicly reachable. That is also why it makes sense to have a specific account from which all your integrations are delivered.</p>
<p>See <a href="https://docs.anthology.com/docs/developer-portal/community-dev_portal" target="_top">Getting Started with the Dev Portal</a> for information.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-future-is-brighter">The Future is Bright(er)<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#the-future-is-brighter" class="hash-link" aria-label="Direct link to The Future is Bright(er)" title="Direct link to The Future is Bright(er)" translate="no">​</a></h2>
<p><strong>Forward Looking Statement</strong> applies:</p>
<blockquote>
<p>Statements regarding our product development initiatives, including new products and future product upgrades, updates or enhancements represent our current intentions, but may be modified, delayed or abandoned without prior notice and there is no assurance that such offering, upgrades, updates or functionality will become available unless and until they have been made generally available to our customers.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="simplification-of-integration-installation">Simplification of Integration Installation<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#simplification-of-integration-installation" class="hash-link" aria-label="Direct link to Simplification of Integration Installation" title="Direct link to Simplification of Integration Installation" translate="no">​</a></h3>
<p>To ensure an optimal customer experience we have a few items which we intend to deliver in 2023. Each of these enable the offset the heavy lift of the installation of any integration from customers to the developer.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="auto-install-of-rest-users-with-privileges">Auto-Install of REST Users with Privileges<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#auto-install-of-rest-users-with-privileges" class="hash-link" aria-label="Direct link to Auto-Install of REST Users with Privileges" title="Direct link to Auto-Install of REST Users with Privileges" translate="no">​</a></h4>
<p>Integrations using the REST API require association with a REST integration user who has the necessary system role privileges (never a System Administrator Role!!!).</p>
<p>The REST APIs identify with <em>entitlements</em> while the systems identify with <em>privileges</em>. This complicates installation of REST integrations not using Three Legged OAuth (3LO).</p>
<p>Late 2023 we intend to release a "manifest" model for integrations which, amongst other useful data points, identifies the entitlements required by an integration. This manifest will be used on Administrator request to install an integration to display important information about the integration to the Administrator - notably the privileges requested by the integration developer.</p>
<p>The now informed Administrator may choose to install the integration at which time the REST integration user is created with the necessary privileges.</p>
<p>No interaction on the part of the Administrator other than reviewing and accepting the installation!</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="lti-and-rest-share-jwt-for-authn">LTI and REST share JWT for authN<a href="https://docs.blackboard.com/blog/Blackboard%20Integrations%20and%20Customer%20Experience#lti-and-rest-share-jwt-for-authn" class="hash-link" aria-label="Direct link to LTI and REST share JWT for authN" title="Direct link to LTI and REST share JWT for authN" translate="no">​</a></h4>
<p>Currently LTI 1.3 and REST APIs use two separate authentication models. LTI 1.3 uses JSON Web Tokens (JWT) and REST uses OAuth 2 basic authentication using Key<!-- -->:Secret<!-- --> pairs.</p>
<p>Late 2023 the use of JWT will be optional for REST API-based integrations and JWT will be used exclusively for LTI 1.3 integrations which also use our REST APIs.</p>
<p>This greatly simplifies the development of LTI 1.3 integrations which use our REST APIs. The optional use of JWTs for non-LTI integrations provide an improved security model for REST API-based integrations while being backward compatible with existing REST integrations.</p>]]></content>
        <author>
            <name>Mark O'Neil</name>
        </author>
        <category label="Best Practices" term="Best Practices"/>
        <category label="Integrations" term="Integrations"/>
        <category label="Partners" term="Partners"/>
        <category label="Developers" term="Developers"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[DevCon 2022 Presentations!]]></title>
        <id>https://docs.blackboard.com/blog/DevCon-2022-Presentations!</id>
        <link href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!"/>
        <updated>2022-08-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[<!-- ---]]></summary>
        <content type="html"><![CDATA[<p>We will be adding sessions here as soon as we get the presentations! If you want to see your DevCon presentation, please write us at <a href="mailto:developers@blackboard.com" target="_blank" rel="noopener noreferrer" class="">developers@blackboard.com</a>. All times are in ET.</p>
<blockquote>
<p><strong>Day 1 @ DevCon 2022</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bb-rest-helper">BB Rest Helper<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#bb-rest-helper" class="hash-link" aria-label="Direct link to BB Rest Helper" title="Direct link to BB Rest Helper" translate="no">​</a></h3>
<p>⏲ 1:00 PM - 1:45 PM Session</p>
<br>
<p>👨‍💻 <strong>Presenter:</strong> Javier Gregori</p>
<p>Creating a proof of concept for an integration from scratch can be tedious, there are many basic elements such API authentication or logs that will need to be sorted out before being able to work on meaningful code, and even then, lots of code will need to be written and tested for API Requests.
This library abstracts the common and boring operations that Blackboard developers face when interfacing with the REST API so they can focus their effort in creating the cool features they need for their integrations.
This library is intended to explore Blackboard REST APIs and to help create POCs for integrations. Please note this tool is not supported by Blackboard and no warranties of any kind are provided.
In this presentation you will get to know the Bb_rest_helper library, and how to set up with Visual studio code and Jupyter notebooks to make the REST of your life easier</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="description">Description<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#description" class="hash-link" aria-label="Direct link to Description" title="Direct link to Description" translate="no">​</a></h4>
<p>The Bb Rest Helper includes 5 classes to simpilfy common API operations with Blackboard APIs;</p>
<ol>
<li class="">Get_Config. This class is used to get configuration variables (url,key,secret)from an external configuration file in Json format. If you are authenticating for more than one API (i.e. Learn and Collaborate) you will need separate configuration files (i.e. learn_config.json and collab_config.json).</li>
<li class="">Auth_Helper. This class is used to get the token that then will be used in the API calls. Provides different methods for the different APIs.</li>
<li class="">Bb_Requests. This class is used to simplify calls to the Blackboard Rest APIs. Provides methods for GET, POST, PUT, PATCH and DELETE requests.</li>
<li class="">Bb_Utils. A set of convenience functions (Logging, printing...), this will be extended over time.</li>
<li class="">Ally_Helper This class is used to simplify interaction with Ally as a service, includes methods to authenticate, upload a file, check processing status and retrieve the feedback. As it is an initial release for this API with limited features, it is implemented as a separate class to provide easier access to these methods rather than having to code them manually or with the Bb_rest_helper library.</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="companion-links">Companion Links<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#companion-links" class="hash-link" aria-label="Direct link to Companion Links" title="Direct link to Companion Links" translate="no">​</a></h4>
<ul>
<li class=""><a href="https://github.com/JgregoriBb/Bb_rest_helper" target="_blank" rel="noopener noreferrer" class="">Javier's GitRepo</a></li>
<li class=""><a href="https://pypi.org/project/Bb-rest-helper/" target="_blank" rel="noopener noreferrer" class="">Pypi project link</a></li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="presentation-pdf">Presentation PDF<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#presentation-pdf" class="hash-link" aria-label="Direct link to Presentation PDF" title="Direct link to Presentation PDF" translate="no">​</a></h4>
<object data="/assets/files/devcon2022-bbresthelper.pdf" width="100%" height="600" type="application/pdf"></object>
<blockquote>
<p><strong>Day 2 @ DevCon 2022</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="blackboard-lms-rest-apis-for-beginners">Blackboard LMS REST APIs for Beginners<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#blackboard-lms-rest-apis-for-beginners" class="hash-link" aria-label="Direct link to Blackboard LMS REST APIs for Beginners" title="Direct link to Blackboard LMS REST APIs for Beginners" translate="no">​</a></h3>
<p>⏲ 11:40 AM - 12:25 AM Session</p>
<br>
<p>👨‍💻 <strong>Presenter:</strong> Davey Herrera</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="presentation-pdf-1">Presentation PDF<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#presentation-pdf-1" class="hash-link" aria-label="Direct link to Presentation PDF" title="Direct link to Presentation PDF" translate="no">​</a></h4>
<object data="/assets/files/devcon2022-restapi4beginners.pdf" width="100%" height="600" type="application/pdf"></object>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="video-companion">Video companion<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#video-companion" class="hash-link" aria-label="Direct link to Video companion" title="Direct link to Video companion" translate="no">​</a></h4>
<iframe width="100%" height="600" src="https://www.youtube.com/embed/fOo04uMcsDA" title="Blackboard LMS REST API for beginners" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="migrating-a-b2-to-lti--rest-deep-dive">Migrating a B2 to LTI &amp; REST Deep dive<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#migrating-a-b2-to-lti--rest-deep-dive" class="hash-link" aria-label="Direct link to Migrating a B2 to LTI &amp; REST Deep dive" title="Direct link to Migrating a B2 to LTI &amp; REST Deep dive" translate="no">​</a></h3>
<p>⏲ 1:45 PM - 3:00 PM Session</p>
<br>
<p>👨‍💻 <strong>Presenter:</strong> Eric Preston</p>
<object data="/assets/files/devcon2022-migratingb2toltiandrest.pdf" width="100%" height="600" type="application/pdf"></object>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="moving-to-ultra-a-phased-approach">Moving to Ultra: A Phased Approach<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#moving-to-ultra-a-phased-approach" class="hash-link" aria-label="Direct link to Moving to Ultra: A Phased Approach" title="Direct link to Moving to Ultra: A Phased Approach" translate="no">​</a></h3>
<p>⏲ 4:15 PM - 5:00 PM Session</p>
<br>
<p>👩‍💻 <strong>Presenter:</strong> Michelle Donaldson</p>
<object data="/assets/files/devcon2022-moving2ultra-phasedaoproach.pdf" width="100%" height="600" type="application/pdf"></object>
<blockquote>
<p><strong>Day 3 @ DevCon 2022</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="making-ultra-your-own-uef-for-beginners">Making ultra your own: UEF for Beginners<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#making-ultra-your-own-uef-for-beginners" class="hash-link" aria-label="Direct link to Making ultra your own: UEF for Beginners" title="Direct link to Making ultra your own: UEF for Beginners" translate="no">​</a></h3>
<p>⏲ 11:30 PM - 12:15 PM Session</p>
<br>
<p>👨‍💻 <strong>Presenter:</strong> Chris Filkins</p>
<p>For years, many of us have relied on Building Blocks as a way to add features and functionality into our Blackboard LMS courses. One of the best tools we ever used was the javascript Hacks tool, which leveraged the renderingHook function to allow a system administrator to further modify and customize their Learn environment with custom tools, banner, footers, etc. Unfortunately, the Ultra experience no longer supports the renderingHook function, removing the key mechanism for these customizations.</p>
<p>In order to restore some of these capabilities, Blackboard LMS implemented a new feature set called the Ultra Extension Framework (UEF). This new framework opens a number of doors for developers to once again customize and extend their Blackboard LMS environments after switching to the Ultra experience. The Ultra Extension Framework consists of two key components – telemetry data for user activity, and injection points to add content at various locations within the Ultra interface.</p>
<p>The telemetry data can include a number of different events, including hover, click, route, as well as portal windows being created and removed. After initially launching as an LTI tool, an UEF tool can subscribe to any number of these events, and typically runs as javascript inside of a hidden iframe within the Ultra interface. From there, the custom script can then submit requests to the Ultra interface to create new panels, banners, notifications, popups, or even a custom help provider.</p>
<p>The attached presentation will provide some sample code snippets from projects that we have deployed in our production environment, including banners and custom help providers.</p>
<object data="/assets/files/devcon2022-makingultrayourown.pdf" width="100%" height="600" type="application/pdf"></object>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices-for-building-your-lti-advantage--rest-applications-for-learn-from-registration-through-release">Best Practices for Building Your LTI Advantage &amp; REST Applications For Learn, From Registration through Release<a href="https://docs.blackboard.com/blog/DevCon-2022-Presentations!#best-practices-for-building-your-lti-advantage--rest-applications-for-learn-from-registration-through-release" class="hash-link" aria-label="Direct link to Best Practices for Building Your LTI Advantage &amp; REST Applications For Learn, From Registration through Release" title="Direct link to Best Practices for Building Your LTI Advantage &amp; REST Applications For Learn, From Registration through Release" translate="no">​</a></h3>
<p>⏲ 9:00 AM - 9:45 PM Session</p>
<br>
<p>👨‍💻 <strong>Presenter:</strong> Mark Kauffman</p>
<p>In this session Mark will give best practices for integrations that use LTI 1.3 and/or the Blackboard LMS REST APIs. There are many ways to improve your integration's performance and use, beginning with registration on the developer portal through the day it's installed on client systems. Given Mark's extensive experience working with 3rd-party integrations, he's selected those commonly missed best practices that, when you use them, will position your integration for maximum success.</p>
<object data="/assets/files/devcon2022-bp4bLTIadvantageandRESTapp4learn.pdf" width="100%" height="600" type="application/pdf"></object>]]></content>
        <author>
            <name>Davey Herrera</name>
        </author>
        <category label="devcon" term="devcon"/>
        <category label="community" term="community"/>
        <category label="recap" term="recap"/>
        <category label="2022" term="2022"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[LTI 1.3 tools must generate their own keys and JWKS URL]]></title>
        <id>https://docs.blackboard.com/blog/2021/07/22/2021/LTI 1.3 tools must generate their own keys and JWKS URL</id>
        <link href="https://docs.blackboard.com/blog/2021/07/22/2021/LTI 1.3 tools must generate their own keys and JWKS URL"/>
        <updated>2021-07-22T12:46:00.000Z</updated>
        <summary type="html"><![CDATA[When we started supporting LTI 1.3/Advantage (back in May of 2019) we chose to generate public/private key pairs for the tools. The tool vendor was then responsible for copying and storing those values on their side.]]></summary>
        <content type="html"><![CDATA[<p>When we started supporting LTI 1.3/Advantage (back in May of 2019) we chose to generate public/private key pairs for the tools. The tool vendor was then responsible for copying and storing those values on their side.</p>
<p>But the <a href="https://imsglobal.org/" target="_blank" rel="noopener noreferrer" class="">IMS Global</a> community has moved away from that model and now suggests that tool vendors generate their own key pairs for LTI authentication and provide their public key via a <a href="https://datatracker.ietf.org/doc/html/rfc7517" target="_blank" rel="noopener noreferrer" class="">JWKS URL</a>. This model is more secure because there is not copying of a private key and allows the LTI Tool provider to follow best practices with key rotation.</p>
<p>We decided to follow that suggestion. If you want to register a new tool with Learn, you have to provide the JWKS URL information. And if you have an existing tool that use the Blackboard-generated private key, please keep in mind that we'll be terminating support in the near future.</p>
<p>NOTE: Once you've made the change, you must have our mutual clients redeploy your LTI 1.3 tool. Redeploy means the following:</p>
<ol>
<li class="">Admin -&gt; Integrations, LTI Tool Providers -&gt; Register LTI 1.3/Advantage Tool</li>
<li class="">Enter the same client ID for your tool that was previously deployed. Click the [Submit] Button.</li>
<li class="">Your tool will be redeployed to use your new JWKS URL.</li>
</ol>
<p>Follow the above steps exactly. Do NOT have them delete the integration as that will destroy all existing links to your tool, which can not be recovered.</p>
<p><a href="https://youtu.be/M_d8-G-hGlI" target="_blank" rel="noopener noreferrer" class="">Here is a video explanation</a> of both the steps you need to take to update your tool's JWKS URL and the step you will need to have our mutual clients take. Note that after you update your tool's JWKS URL on the developer portal our mutual clients will NOT able to use your product until after they redeploy as described above and in the video.</p>
<p>FAQ:</p>
<ol>
<li class="">Is this just a background change, and it will not impact anything on the front end?<br>
<!-- -->-&gt; There is no impact to how our mutual clients use the LTI Tool or Learn.</li>
<li class="">Does making the change at the central location serve the purpose, or are we required to plan anything around individual connections for separate schools?<br>
<!-- -->-&gt; You will need to work with the individual schools to ensure that after you make the chage they redploy your tool as described above.</li>
<li class="">Will schools transition seamlessly once we transition from a static public key to keyset URL (JWKS), or does it require any intervention from the Black side or the school admins?<br>
<!-- -->-&gt; The school admins will need to redeploy your tool as described above.</li>
<li class="">Currently, both static public key and keyset URL (JWKS) are going through successfully. Is it because Blackboard hasn’t yet discontinued supporting the static public key?<br>
<!-- -->-&gt; Blackboard will continue supporting the keys that were originally provided until further notice, likely until the end of 2022*.</li>
</ol>
<p>As always, if you have any questions, check out the <a href="https://docs.anthology.com/docs/Community/community-contact_us" target="_blank" rel="noopener noreferrer" class="">contact us page</a> and let us know!</p>
<p>*Statements regarding our product development initiatives, including new products and future product upgrades, updates or enhancements represent our current intentions, but may be modified, delayed or abandoned without prior notice and there is no assurance that such offering, upgrades, updates or functionality will become available unless and until they have been made generally available to our customers.</p>]]></content>
        <author>
            <name>Eric Preston</name>
        </author>
        <category label="standards" term="standards"/>
        <category label="lti" term="lti"/>
        <category label="keys" term="keys"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Use One-Time Session Token to Authenticate with UEF]]></title>
        <id>https://docs.blackboard.com/blog/2021/05/10/2021/use one time session tokens instead of cookies for UEF authentication</id>
        <link href="https://docs.blackboard.com/blog/2021/05/10/2021/use one time session tokens instead of cookies for UEF authentication"/>
        <updated>2021-05-10T16:13:00.000Z</updated>
        <summary type="html"><![CDATA[In testing with the Google Canary Chrome Browser, one of our clients discovered an issue that was blocking users from logging in to their Learn instance. After much troubleshooting, we discovered a multi-layer issue that brings us to, you guessed it, cookies.]]></summary>
        <content type="html"><![CDATA[<p>In testing with the <a href="https://www.google.com/chrome/canary/" target="_blank" rel="noopener noreferrer" class="">Google Canary Chrome Browser</a>, one of our clients discovered an issue that was blocking users from logging in to their Learn instance. After much troubleshooting, we discovered a multi-layer issue that brings us to, you guessed it, <a href="https://docs.anthology.com/blog/2020/10/15/Cookies-and-Browsers" target="_blank" rel="noopener noreferrer" class="">cookies</a>.</p>
<blockquote>
<p><strong>This affects clients in SaaS with Ultra Base Navigation enabled using Ultra integrations that rely on UEF</strong> <br> &gt; <strong>Review UPDATE in LTI 1.3 section. This post previously mentioned a bug that no longer exists.</strong></p>
</blockquote>
<p>Here is a brief description of the contributing factors:</p>
<p>First, the client had built a custom Ultra login page. The page included code designed to ensure that Learn login pages would never render inside of an iframe within Learn. It looks like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">if&nbsp;(&nbsp;top&nbsp;!=&nbsp;self&nbsp;)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;top.location.replace(&nbsp;self.location.href&nbsp;);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>In and of itself there's nothing wrong with it. We, at Blackboard, have removed it from the default Ultra login page, but many clients use it in Original login pages, and so it's moved with them into Ultra.</p>
<blockquote>
<p>If you are unsure whether you have a custom login page, visit <a href="https://help.blackboard.com/learn/Administrator/SaaS/User_Interface_Options/Ultra_Experience/Institution_Branding/Customize_the_Login_Page" target="_blank" rel="noopener noreferrer" class="">help.blackboard.com</a> for more information.</p>
</blockquote>
<p>Secondly, when a user logged in, Ultra Extensions automatically fired off an LTI launch to UEF-enabled tools. The way UEF works is: after the LTI launch is validated, the tool redirects to the Learn REST endpoint to initiate a UserAuth flow. In our documentation, we call this a Three-Legged OAuth or <a href="https://docs.anthology.com/docs/rest-apis/learn/getting-started/rest_apis-learn-getting-started-3lo" target="_blank" rel="noopener noreferrer" class="">3LO</a>. In most cases, it's a process that relies on a session cookie to hold everything together. This impending release of Chrome (and other browsers) will block this cookie because everything is happening across domains and involves the use of iframes.</p>
<p>So what happens is that, even though the integration is configured in Learn to not force the end-user to authorize the integration, the lack of the session cookie means that Learn has no idea that this user is logged in, so it pops open the login page.</p>
<p>Remember that code snippet above in the custom login page? Well, that takes over the entire browser page with the Learn login. And when the user logs in again, it renders the JavaScript meant for the UEF iframe into the page. In other words, it overtakes your Learn browser session. There is no way to actually get past that screen.</p>
<p>Related, this same issue affects Safari users when <a href="https://support.apple.com/guide/safari/prevent-cross-site-tracking-sfri40732/mac" target="_blank" rel="noopener noreferrer" class="">cross-site tracking is disabled</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-what-can-you-do">So what can you do?<a href="https://docs.blackboard.com/blog/2021/05/10/2021/use%20one%20time%20session%20tokens%20instead%20of%20cookies%20for%20UEF%20authentication#so-what-can-you-do" class="hash-link" aria-label="Direct link to So what can you do?" title="Direct link to So what can you do?" translate="no">​</a></h2>
<p>Well, that depends upon who is reading this blog. If you are an administrator trying to get your users back in Learn, the most immediate fix is to remove that snippet from your login page. It won't fix your broken UEF integration, but it will at least let your users log in and interact with Learn.</p>
<p>If you are a developer that has built a UEF integration, we actually implemented a fix for this in April: a way to bypass the need for a session cookie in this process. In the LTI launch, we now provide what is called a&nbsp;one-time session cookie. This is present in both LTI 1.1 and 1.3 launches.</p>
<p>This one-time session cookie is added to the claims in the LTI 1.3 JWT and the form POST parameters in LTI 1.1. You can grab that value from the LTI launch, return it as a parameter in your 3LO authorization code request, and your problem will be solved.</p>
<p>UPDATE: This section previously mentioned a bug where the userId needed to be appended to the one_time_session token. This bug has been fixed. Your code can now use the one_time_session_token as provided by Blackboard LMS without appending the userId. Blackboard no longer appends a userId, nor expects it in the returned value. If your code does append a comma and userId, that’s OK, you don’t immediatly need to change your code it as Blackboard just ignores the comma and what comes after if those are part of the value you send back.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lti13">LTI&nbsp;1.3<a href="https://docs.blackboard.com/blog/2021/05/10/2021/use%20one%20time%20session%20tokens%20instead%20of%20cookies%20for%20UEF%20authentication#lti13" class="hash-link" aria-label="Direct link to LTI&nbsp;1.3" title="Direct link to LTI&nbsp;1.3" translate="no">​</a></h3>
<p>In LTI 1.3, you will see the value in the <code>https://blackboard.com/lti/claim/one_time_session_token</code> claim. This token is made up of a specially generated token value. Here's a Python 3 code snippet to illustrate how this might look.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Get&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;one&nbsp;time&nbsp;session&nbsp;token&nbsp;from&nbsp;the&nbsp;LTI&nbsp;claim</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;one_time_session_token&nbsp;&nbsp;=&nbsp;message_launch_data['https://blackboard.com/lti/claim/one_time_session_token']</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Add&nbsp;the&nbsp;one_time_session_token&nbsp;to&nbsp;the&nbsp;query&nbsp;parameters&nbsp;to&nbsp;send&nbsp;to&nbsp;the&nbsp;Authorization&nbsp;Code&nbsp;endpoint</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;=&nbsp;{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'redirect_uri'&nbsp;:&nbsp;Config.config['app_url']&nbsp;+&nbsp;'/authcode/',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'response_type'&nbsp;:&nbsp;'code',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'client_id'&nbsp;:&nbsp;Config.config['learn_rest_key'],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'one_time_session_token'&nbsp;:&nbsp;one_time_session_token,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'scope'&nbsp;:&nbsp;'*',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'state'&nbsp;:&nbsp;str(uuid.uuid4())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Encode&nbsp;the&nbsp;parameters</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;encoded_params&nbsp;=&nbsp;urllib.parse.urlencode(params)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Redirect&nbsp;the&nbsp;successful&nbsp;LTI&nbsp;validation&nbsp;to&nbsp;the&nbsp;Authorization&nbsp;Code&nbsp;endpoint</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&nbsp;&nbsp;&nbsp;&nbsp;return(redirect(learn_url&nbsp;+&nbsp;'/learn/api/public/v1/oauth2/authorizationCode?'&nbsp;+&nbsp;encoded_params))</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lti11">LTI&nbsp;1.1<a href="https://docs.blackboard.com/blog/2021/05/10/2021/use%20one%20time%20session%20tokens%20instead%20of%20cookies%20for%20UEF%20authentication#lti11" class="hash-link" aria-label="Direct link to LTI&nbsp;1.1" title="Direct link to LTI&nbsp;1.1" translate="no">​</a></h3>
<p>By now, I hope you are using LTI 1.3, but I know many are not. As a result, we also added a one-time session token to LTI 1.1 launches. This will come in the form POST parameter <code>ext_one_time_session_token</code>. Just like in the 1.3 example, your application should take this value from the LTI launch, append it to the authorization code request endpoint as <code>one_time_session_token=that_token</code> and redirect them to the authorization code endpoint.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://docs.blackboard.com/blog/2021/05/10/2021/use%20one%20time%20session%20tokens%20instead%20of%20cookies%20for%20UEF%20authentication#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>We have validated this fix with one of the partners that was affected. If you are a developer, please fix the issue immediately! If you are an administrator of a Learn SaaS instance using Ultra, and you have UEF integrations, make sure you do not have that JavaScript snippet on your login page. And if you do, please remove it. Then let your UEF integration partners and developers know that this fix must be made as soon as possible.</p>
<p>Regardless of whether you are an administrator or a developer, please feel free to reach out to us at&nbsp;<a href="mailto:developers@blackboard.com" target="_blank" rel="noopener noreferrer" class="">developers@blackboard.com</a>&nbsp;with any questions.</p>
<p>Happy coding!</p>]]></content>
        <author>
            <name>Scott Hurrey, Mark Kauffman</name>
        </author>
        <category label="uef" term="uef"/>
        <category label="ultra" term="ultra"/>
        <category label="lti" term="lti"/>
        <category label="rest" term="rest"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to Create a User With Limited Entitlements For REST API Calls]]></title>
        <id>https://docs.blackboard.com/blog/2021/01/06/2021/How to Create a User With Limited Entitlements For REST API Calls</id>
        <link href="https://docs.blackboard.com/blog/2021/01/06/2021/How to Create a User With Limited Entitlements For REST API Calls"/>
        <updated>2021-01-06T12:59:00.000Z</updated>
        <summary type="html"><![CDATA[First, as our documentation states, a Learn admin should never be told to associate a user with Learn admin privileges with any REST API integration, see this document. Hence we often get questions from folks on how to create a user to associate with a REST API integration that has limited capability on a Learn system. One way is to research and design your REST application to use OAuth 2 3-legged Authentication. See the documents referenced below. 3LO guarentees that the user using your REST Application can only do what they can do via the Learn UX when they are logged into Learn.]]></summary>
        <content type="html"><![CDATA[<p>First, as our documentation states, a Learn admin should never be told to associate a user with Learn admin privileges with any REST API integration, see this document. Hence we often get questions from folks on how to create a user to associate with a REST API integration that has limited capability on a Learn system. One way is to research and design your REST application to use OAuth 2 3-legged Authentication. See the documents referenced below. 3LO guarentees that the user using your REST Application can only do what they can do via the Learn UX when they are logged into Learn.</p>
<p>However, if your application is using our OAuth 2 2-legged Authentication read on. Or I should say, watch on. I created the following to answer the question "Is it possible to create a user that has only the necessary permissions and avoid using "Learn System Admin" user?"</p>
<p>The answer is yes! <a href="https://youtu.be/uyKdbCpcZMc" target="_blank" rel="noopener noreferrer" class="">Here's a video explaining exactly how to proceed</a>.</p>
<p>Reference Documentation:</p>
<ul>
<li class=""><a href="https://docs.anthology.com/docs/rest-apis/learn/admin/rest_apis-learn-admin-rest_and_learn" target="_blank" rel="noopener noreferrer" class="">Managing REST Integrations in Learn: The REST Integrations Tool for System Administrators</a></li>
<li class=""><a href="https://docs.anthology.com/docs/rest-apis/learn/getting-started/rest_apis-learn-getting-started-basic_auth" target="_blank" rel="noopener noreferrer" class="">Basic Authentication with REST</a></li>
<li class=""><a href="https://docs.anthology.com/docs/rest-apis/learn/getting-started/rest_apis-learn-getting-started-3lo" target="_blank" rel="noopener noreferrer" class="">Three-Legged OAuth</a></li>
<li class=""><a href="https://github.com/Kong/mashape-oauth/blob/master/FLOWS.md" target="_blank" rel="noopener noreferrer" class="">https://github.com/Kong/mashape-oauth/blob/master/FLOWS.md</a></li>
<li class=""><a href="https://docs.anthology.com/docs/rest-apis/learn/getting-started/Tutorials" target="_blank" rel="noopener noreferrer" class="">REST Tutorials</a></li>
<li class=""><a href="https://community.blackboard.com/blogs/4/18" target="_blank" rel="noopener noreferrer" class="">Bookmarklet to help map entitlements to permissions</a> (requires login.) or <a href="https://docs.anthology.com/docs/rest-apis/learn/getting-started/rest_apis-learn-getting-started-entitlements" target="_blank" rel="noopener noreferrer" class="">document on this site</a></li>
</ul>]]></content>
        <author>
            <name>Mark Kauffman</name>
        </author>
        <category label="rest" term="rest"/>
        <category label="learn" term="learn"/>
        <category label="api" term="api"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Caliper Documentation Updated for 1.1]]></title>
        <id>https://docs.blackboard.com/blog/2021/01/05/2021/Caliper-Documentation-Updated-for-1.1</id>
        <link href="https://docs.blackboard.com/blog/2021/01/05/2021/Caliper-Documentation-Updated-for-1.1"/>
        <updated>2021-01-05T12:59:00.000Z</updated>
        <summary type="html"><![CDATA[We have spent some time over the holiday break updating and organizing our documentation better. One of the longest outstanding changes was to update the Caliper event samples from 1.0 to 1.1.]]></summary>
        <content type="html"><![CDATA[<p>We have spent some time over the holiday break updating and organizing our documentation better. One of the longest outstanding changes was to update the Caliper event samples from 1.0 to 1.1.</p>
<p>I am pleased to announce that we have finally completed this project. The <a href="https://docs.anthology.com/docs/Standards/Caliper/events/caliper-events-guide" target="_blank" rel="noopener noreferrer" class="">event guide</a> is largely unchanged, but the individual events have all been updated to show current sample payloads from each event, allowing you to better anticipate the messages you will receive and better plan your storage and reporting requirements.</p>
<p>Over the next few weeks, we will be highlighting some of the other key updates that we hope will help ease the onboarding process for new developers and make finding exactly what you need when you need it for everyone.</p>
<p>Happy Coding!</p>]]></content>
        <author>
            <name>Scott Hurrey</name>
        </author>
        <category label="standards" term="standards"/>
        <category label="caliper" term="caliper"/>
        <category label="update" term="update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SOAP EOL Explained]]></title>
        <id>https://docs.blackboard.com/blog/2020/12/16/2020/SOAP-EOL-Explained</id>
        <link href="https://docs.blackboard.com/blog/2020/12/16/2020/SOAP-EOL-Explained"/>
        <updated>2020-12-16T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[Back in the day, January 4, 2019 to be exact, Blackboard announced deprecation of our SOAP Web Services with this article Blackboard SOAP Web Services Deprecation]]></summary>
        <content type="html"><![CDATA[<p>Back in the day, January 4, 2019 to be exact, Blackboard announced deprecation of our SOAP Web Services with this article <a href="https://blackboard.secure.force.com/publickbarticleview?id=kA039000000Tm3cCAC&amp;homepage=true" target="_blank" rel="noopener noreferrer" class="">Blackboard SOAP Web Services Deprecation</a></p>
<p>Now, almost two years later in our <a href="https://help.blackboard.com/learn/Administrator/SaaS/Release_Notes" target="_blank" rel="noopener noreferrer" class="">Learn SaaS Relase Notes</a> we've written "As of December 31, 2020, Learn SOAP Web Services are no longer supported, as they have reached the end of life per our deprecation policy." What does this mean for you as a develoepr?</p>
<p>The most common concern is "Will my SOAP code continue to work in an earlier version of Learn?" or some variation. Here's a recent example: "Will this be for all versions, or will SOAP API still be available on version 3800?"</p>
<p>The answer is that client's self and manged-hosted systems that are on older versions of Learn will not be impacted. If your client is runnign 3800.0.3 and upgrades to the most recent Cumulative Update, the SOAP Webservices should continue to work for them.</p>
<p>For self and managed-hosted clients that are on 3900.0.0 and are now upgrading using the same build numbers as in SaaS, SOAP will not be supported in any release post Dec 31, 2020.</p>
<p>Another common quesiton is from those using the Learn LIS 2.0 SIS integration, which is SOAP based. No, we are keeping the LIS 2.0 SIS integration in the product at this time. It will not be affected.</p>
<p>If you have additional questions, drop a line to <a href="mailto:developers@blackboard.com" target="_blank" rel="noopener noreferrer" class="">developers@blackboard.com</a> and we'll update this blog post with the answer.</p>
<p>Happy 2021!</p>]]></content>
        <author>
            <name>Mark Kauffman</name>
        </author>
        <category label="soap" term="soap"/>
        <category label="learn" term="learn"/>
        <category label="eol" term="eol"/>
        <category label="api" term="api"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cookies and Browsers]]></title>
        <id>https://docs.blackboard.com/blog/2020/10/15/2020/Cookies-and-Browsers</id>
        <link href="https://docs.blackboard.com/blog/2020/10/15/2020/Cookies-and-Browsers"/>
        <updated>2020-10-15T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[Most people like cookies. Internet browsers used to like cookies, but a lot has changed in the last few years.]]></summary>
        <content type="html"><![CDATA[<p>Most people like cookies. Internet browsers used to like cookies, but a lot has changed in the last few years.</p>
<p>We are seeing a lot of applications stop working in some browsers because cookies are not being shared, and this post hopes to help explain why that is happening and what can be done about it.</p>
<p>A web application may set a cookie to track a user’s session. This is very common, however if your web application is going to be hosted in an iframe, then there’s a good chance your cookie won’t be sent back to you. This is because browsers are clamping down on sending “3rd-party” cookies back to applications hosted in an iframe. Note that a 3rd party is a site that is hosted on a domain different than the 1st party, or your web application. The reason is because these cookies can be used for tracking your internet and browsing activity. Safari has disallowed this for years as a user privacy measure.</p>
<p>Another case where cookies aren’t being sent back is during a form POST back to your application. If you set a cookie, then launch to a 3rd party application, if that application does a form POST back to you, the browser will likely not send your cookie back because it is trying to help prevent cross-site request forgery attacks.</p>
<p>Rather than detail all the scenarios and work arounds here I link to two web pages that are immensely helpful in explaining the situation and some possible workarounds.</p>
<p>The TL;DR is if you must set a cookie in your web application, be careful how you configure that cookie’s properties, and understand that at least in Safari, your cookies may not get passed back to you. The other browser makers are going to get as restrictive as Safari soon.</p>
<ul>
<li class=""><a href="https://web.dev/samesite-cookies-explained/" target="_blank" rel="noopener noreferrer" class="">Samesite Cookies Explained</a></li>
<li class=""><a href="https://web.dev/samesite-cookie-recipes/" target="_blank" rel="noopener noreferrer" class="">Samesite Cookie Recipes</a></li>
</ul>]]></content>
        <author>
            <name>Eric Preston</name>
        </author>
        <category label="lti" term="lti"/>
        <category label="learn" term="learn"/>
        <category label="api" term="api"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Student Id Template Variable]]></title>
        <id>https://docs.blackboard.com/blog/2020/10/07/2020/New-Student-Id-Template-Variable</id>
        <link href="https://docs.blackboard.com/blog/2020/10/07/2020/New-Student-Id-Template-Variable"/>
        <updated>2020-10-07T08:40:00.000Z</updated>
        <summary type="html"><![CDATA[New in SaaS and the forthcoming 3900 release\* an @X@user.studentid@X@ template variable!.]]></summary>
        <content type="html"><![CDATA[<p>New in SaaS and the forthcoming 3900 release* <a href="https://docs.anthology.com/docs/rest-apis/learn/advanced/rest_apis-learn-advanced-dynamic_rendering" target="_blank" rel="noopener noreferrer" class="">an @X@user.student_id@X@ template variable!</a>.</p>
<ul>
<li class="">Statements regarding our product development initiatives, including new products and future product upgrades, updates or enhancements represent our current intentions, but may be modified, delayed or abandoned without prior notice and there is no assurance that such offering, upgrades, updates or functionality will become available unless and until they have been made generally available to our customers.</li>
</ul>
<p>-markk</p>]]></content>
        <author>
            <name>Mark Kauffman</name>
        </author>
        <category label="learn" term="learn"/>
        <category label="template-variables" term="template-variables"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oct 2020 - Changes that will impact Learn B2 Integrations]]></title>
        <id>https://docs.blackboard.com/blog/2020/10/04/2020/Changes-That-Impact-Learn-B2-Integrations</id>
        <link href="https://docs.blackboard.com/blog/2020/10/04/2020/Changes-That-Impact-Learn-B2-Integrations"/>
        <updated>2020-10-04T08:40:00.000Z</updated>
        <summary type="html"><![CDATA[Read this article . Download Oct 2020 - Changes that will impact Learn Integrations.docx to find out how to get early access for testing.]]></summary>
        <content type="html"><![CDATA[<p>Read <a href="https://docs.anthology.com/docs/archive/b2/resources/preparing-for-saas-and-new-learn-versions" target="_blank" rel="noopener noreferrer" class="">this article</a> . Download <a href="https://docs.blackboard.com/assets/files/changes-that-will-impact-learn-oct2020-87df31b1d6148c82441559509a9d1afb.docx" target="_blank" class="">Oct 2020 - Changes that will impact Learn Integrations.docx</a> to find out how to get early access for testing.</p>
<p>-Mark Kauffman</p>]]></content>
        <author>
            <name>Mark Kauffman</name>
        </author>
        <category label="building-blocks" term="building-blocks"/>
        <category label="update" term="update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ally as a Service and UEF Documentation now available]]></title>
        <id>https://docs.blackboard.com/blog/2020/09/03/2020/Ally-as-a-Service-and-UEF-Documentation-now-available</id>
        <link href="https://docs.blackboard.com/blog/2020/09/03/2020/Ally-as-a-Service-and-UEF-Documentation-now-available"/>
        <updated>2020-09-03T12:40:00.000Z</updated>
        <summary type="html"><![CDATA[Today we launched two new sections of developer documentation - Ally as a Service (AaaS) and the Learn Ultra Extension Framework(https://docs.anthology.com/docs/Rest%20APIs/premium-apis/uef/uef-getting-started) (UEF). These new APIs give you access to integration points and functionality that allows you to bring the power of Blackboard into your applications, and ultimately, your user's experience.]]></summary>
        <content type="html"><![CDATA[<p>Today we launched two new sections of developer documentation - <a href="https://docs.anthology.com/docs/Rest%20APIs/ally/getting-started" target="_blank" rel="noopener noreferrer" class="">Ally as a Service</a> (AaaS) and the [Learn Ultra Extension Framework](<a href="https://docs.anthology.com/docs/Rest%20APIs/premium-apis/uef/uef-getting-started" target="_blank" rel="noopener noreferrer" class="">/rest-apis/learn</a> (UEF). These new APIs give you access to integration points and functionality that allows you to bring the power of Blackboard into your applications, and ultimately, your user's experience.</p>
<p>Ally as a Service is a standalone, separately licensed API to apply specific components of Ally's approach to content within your application. In its initial form, you are able to upload files, process them through Ally's accessibility checklist, and retrieve data that tells you what can be improved. This is only the tip of the iceberg, so make sure you continue to monitor this amazing capability for enhancements moving forward. For more information, including a conversation about pricing, reach out to your Account Executive.</p>
<p>The Ultra Extension Framework Premium APIs allow an integration to subscribe to events happening real-time in the Ultra UI, and respond to those events by interacting directly with the UI to do things like open panels, display modals, show messages and notifications, and augment the help system in Learn. Partners will need to be at a bronze level or higher to access these Premium APIs. See the partnership team for more information. If you are not a partner, check out <a href="https://docs.anthology.com/docs/partners/become-a-partner" target="_blank" rel="noopener noreferrer" class="">how to become a partner</a>. Licensed clients need only request access. Access is granted to your group in the developer portal, much like rate limits. Just open a case on Behind the Blackboard to get started!</p>
<p>As always, <a href="https://docs.anthology.com/docs/Community/contact.md" target="_blank" rel="noopener noreferrer" class="">let us know</a> if you have any questions!</p>
<p>Happy Coding!</p>]]></content>
        <author>
            <name>Scott Hurrey</name>
        </author>
        <category label="rest" term="rest"/>
        <category label="ally" term="ally"/>
        <category label="learn" term="learn"/>
        <category label="ultra" term="ultra"/>
        <category label="uef" term="uef"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[REST and UEF Tutorials]]></title>
        <id>https://docs.blackboard.com/blog/2020/08/24/2020/NewRESTandUEF-tutorials</id>
        <link href="https://docs.blackboard.com/blog/2020/08/24/2020/NewRESTandUEF-tutorials"/>
        <updated>2020-08-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[New!! Visit the REST Tutorials and UEF Tutorials pages for our tutorials on these topics!!]]></summary>
        <content type="html"><![CDATA[<p>New!! Visit the <a href="https://docs.anthology.com/docs/rest-apis/learn/getting-started/rest_apis-learn-getting-started-tutorials" target="_blank" rel="noopener noreferrer" class="">REST Tutorials</a> and <a href="https://docs.anthology.com/docs/rest-apis/premium-apis/uef/Tutorials" target="_blank" rel="noopener noreferrer" class="">UEF Tutorials</a> pages for our tutorials on these topics!!</p>
<p>Cheers!
-markk</p>]]></content>
        <author>
            <name>Mark Kauffman</name>
        </author>
        <category label="rest" term="rest"/>
        <category label="uef" term="uef"/>
        <category label="tutorials" term="tutorials"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[DevCon 2020 - New LTI Advantage Tutorial]]></title>
        <id>https://docs.blackboard.com/blog/2020/08/24/2020/DevCon-2020-new-lti-advantage-tutorial</id>
        <link href="https://docs.blackboard.com/blog/2020/08/24/2020/DevCon-2020-new-lti-advantage-tutorial"/>
        <updated>2020-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Be sure to revisit the Developing an LTI Advantage Solution page for the latest and greatest tutorial from DevCon 2020!]]></summary>
        <content type="html"><![CDATA[<p>Be sure to revisit the <a href="https://docs.anthology.com/docs/lti/tutorials/develop-lti-advantage-solution" target="_blank" rel="noopener noreferrer" class="">Developing an LTI Advantage Solution</a> page for the latest and greatest tutorial from DevCon 2020!</p>
<p>Cheers!
-markk</p>]]></content>
        <author>
            <name>Mark Kauffman</name>
        </author>
        <category label="lti" term="lti"/>
        <category label="standards" term="standards"/>
        <category label="learn" term="learn"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[DevCon 2020 By The Numbers]]></title>
        <id>https://docs.blackboard.com/blog/2020/08/03/2020/DevCon-2020-by-the-numbers</id>
        <link href="https://docs.blackboard.com/blog/2020/08/03/2020/DevCon-2020-by-the-numbers"/>
        <updated>2020-08-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[DevCon 2020 is in the books, and what an amazing conference it was. This blog will start a weekly series in which everything Thursday, we will talk about DevCon from a content perspective. To begin this series, I want to set some context about the scope of this conference, so you, the reader, will have a baseline to base your opinions from.]]></summary>
        <content type="html"><![CDATA[<p>DevCon 2020 is in the books, and what an amazing conference it was. This blog will start a weekly series in which everything Thursday, we will talk about DevCon from a content perspective. To begin this series, I want to set some context about the scope of this conference, so you, the reader, will have a baseline to base your opinions from.</p>
<p>So let's start with some basic figures:</p>
<ul>
<li class="">Client Registrations: 3,113​</li>
<li class="">Institutions: 1,276​</li>
<li class="">Countries: 54​</li>
<li class="">Badges: 2,348​</li>
<li class="">358 Unique attendees to live sessions​</li>
<li class="">2,352 Attendees to live sessions total​</li>
<li class="">121,842 Collab session minutes</li>
<li class="">Blackboarders: 300​</li>
</ul>
<p>If we really look at this, we can come up with some interesting insights.</p>
<p>If we base our calculations on unique attendees to live sessions, we can see that the average attendee spent almost 6 hours actively engaged in sessions. We had 71 hours worth of sessions spread out over three separate time zones -- Monday - Friday 8am-10am EDT, Monday - Friday 1pm-3pm EDT and on five days, 3pm to 4pm, and Monday-Thursday 8pm-10pm EDT -- so the average attendee joining 6 sessions is pretty amazing.</p>
<p>We also issued 6.6 badges per active attendee programmatically through Badgr. These badges included attending at least 75% of a collab session associated with a session, pathways, which awarded badges based on predetermined groups of session badges, interaction with Ally, and earning points and promotions in the leaderboard.</p>
<p>Speaking of insights, let's take a look at a few that show how users interacted with the content provided:</p>
<p><img decoding="async" loading="lazy" alt="Attendance by Session and Region" src="https://docs.blackboard.com/assets/images/blogs-devcon-numbers-1-33694e5a5349f395b78cab26b0eac457.png" title="Attendance by Session and Region" width="2054" height="1155" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Registration by Country" src="https://docs.blackboard.com/assets/images/blogs-devcon-numbers-2-49b4100e8d8bdf63019c3d6adb56a977.png" title="Registration by Country" width="2050" height="1154" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Collaborate Minutes By Day" src="https://docs.blackboard.com/assets/images/blogs-devcon-numbers-3-fa0028f1d2b077ad8e2fb27813ed9f4b.png" title="Collaborate Minutes By Day" width="2050" height="1147" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Recording Views and Downloads" src="https://docs.blackboard.com/assets/images/blogs-devcon-numbers-4-16d48a4fa72c5d7b70120424d0eeef63.png" title="Recording Views and Downloads" width="2051" height="1153" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Final Leaderboard" src="https://docs.blackboard.com/assets/images/blogs-devcon-numbers-5-703b4b9af6723876e8391fb9feea37c1.png" title="Final Leaderboard" width="2052" height="1154" class="img_ev3q"></p>
<p>Numbers and charts are cool, but what really matters from a DevCon perspective, is the experience of the attendees. Here are a few quotes that I think sum up the DevCon 2020 experience more that any statistic or chart can:</p>
<blockquote>
<p>“SUPER big high-five / cheers / shout-out and ALL the other superlatives out to @Scott Hurrey and all that helped make this 2020 DevCon !!!! have greatly enjoyed it in this time of Social Distancing”​</p>
</blockquote>
<ul>
<li class="">Kevin Squire, PA Virtual Charter School</li>
</ul>
<blockquote>
<p>“Thanks @shurrey Scott for an awesome experience.. and thank you to all the presenters as well as participants. Look forward to continue networking and finding better solutions for students and faculty.”​</p>
</blockquote>
<ul>
<li class="">Arokia Raj, INTI International Universities and Colleges, Malaysia</li>
</ul>
<blockquote>
<p>“A big thank you to @shurrey and colleagues from @Blackboard for making the 2020 #DevCon a really special online experience. Spreading the event out over a fortnight gave participants a chance to practice and play, not just listen. Fun in dark times.”​</p>
</blockquote>
<ul>
<li class="">Malcolm Murray, Durham</li>
</ul>
<p>To summarize, DevCon 2020 was a unique experience, and one that gave me a little bit of normalcy. Of course I would rather see everyone in person, but since I can't, I was extremely happy we could have a virtual get-together.</p>
<p>Happy Coding!
-scott</p>]]></content>
        <author>
            <name>Scott Hurrey</name>
        </author>
        <category label="devcon" term="devcon"/>
        <category label="community" term="community"/>
        <category label="recap" term="recap"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[In Orbit at DevCon 2020]]></title>
        <id>https://docs.blackboard.com/blog/20200710-inorbitatdevcon2020</id>
        <link href="https://docs.blackboard.com/blog/20200710-inorbitatdevcon2020"/>
        <updated>2020-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[DevCon 2020 kicked off in full force this week with clients, partners and Blackboarders around the world coming together in Learn Ultra to network, share knowledge, and dig deeper into Blackboard tech.]]></summary>
        <content type="html"><![CDATA[<p>DevCon 2020 kicked off in full force this week with clients, partners and Blackboarders around the world coming together in Learn Ultra to network, share knowledge, and dig deeper into Blackboard tech.</p>
<p>We’ve had a record number of people at DevCon with 2,273 attendees logging in from 973 institutions and 43 countries throughout the week. We also had some amazing content, delivered all over the world.</p>
<p>Our most-attended session was 'Collaborate Best Practices' presented by Amy Eyre from the University of York and Helga Gunnarsdottir from the University of the West of England (UWE), co-chairs of the EMEA Mobile and Collaborate User Group, affectionately known as <a href="https://community.blackboard.com/groups/home/57" target="_blank" rel="noopener noreferrer" class="">MoCo</a>.</p>
<p>Other highlights include the 'May the Data be with you' series. I definitly miss seeing everyone in person, so the lively interaction in these sessions led by a talented group of System Administrators was definitely the next best thing. Big thanks to Casey Eubank from WSU Tech, Chris Bray from Arkansas, Heather Crites from Columbia State Community College, Dan Gioia from St. Louis Community College, Bradley Lawton from Louisville, and Mark Reynolds from University of Illinois at Urbana-Champaign.</p>
<p>There were also a number of other sessions that were well-attended and extremely interesting, including:</p>
<ul>
<li class=""><strong>'LTI Advantage for System Administrators'</strong>, a thorough overview from Blackboard's own Eric Preston of the history of LTI, the new LTI Advantage spec, and everything a system administrator needs to know about LTI.</li>
<li class=""><strong>'A Galaxy of Learn Data - Blast off with BbData &amp; Python!'</strong> was a look at the amazing work that Mike Bechtel from Indian River State College has done using Python to interact with Blackboard Data.</li>
<li class=""><strong>'Turning any resource into an LTI tool to optimize Base Navigation'</strong> from University of Chicago's Szymon Machajewski was an entertaining look at a simple tool that turns any URL into an LTI tool that can be embedded into any LTI-compliant platform.</li>
</ul>
<p>I wish I could list highlights of all of the sessions, but in the spirit of brevity, let me just say thank you. Thank you to all of our presenters for taking the time out of your busy schedule -- sometimes crazy early, crazy late, or both -- to share your knowledge with the rest of our community. There is no better way to support and learn from each other than open communication. I look forward to building on this virtual DevCon to continue that global communication.</p>
<p>Next week, we’ll continue running sessions three times each day to accommodate all time zones and schedules. Here are some sessions you won’t want to miss:</p>
<ul>
<li class="">The Python and the Postman - REST APIs for Beginners</li>
<li class="">Migrate Your B2 to LTI Advantage and REST</li>
<li class="">Models for Learn REST and LTI Integrations</li>
<li class="">The DevCon Gamification Query: what we built, how we designed it, and how might you adapt it for your institution</li>
<li class="">GUI Admin Tips and Tricks Unconference Sessions</li>
</ul>
<p>And don’t forget about Hackboard: Data. This weeklong event will allow attendees to build meaningful insights against the wealth of information Blackboard Data puts at your fingertips. We’ll kick off Monday and finish on Friday, with two Q&amp;A sessions in between. So add the Hackboard: Data session to your schedule and join us for the kickoff on Monday!</p>
<p>As I write this, it looks like Mark Reynolds is atop the leaderboard, with Bradley Lawton and Eric Silva fast on his heels. And I would be remiss if I didn't mention our badging with Badgr. So far (not including Friday), we have awarded 480 badges, including:</p>
<ul>
<li class="">Arokia Raj, INTI Internation University and Colleges in Malaysia, who earned the 'Daily Champions Champion' badge by earning all of the Daily Champion badges.</li>
<li class="">Mark Carroll, Mark Reynolds, and Kevin Lowey who earned the 'Let's take it data day' badge, by attending 4 of the 8 data-based (see what I did there?) sessions.</li>
<li class="">Mark Carroll, Alicia Dunlap, Irene Rojas, and Elizabeth Barcena, who have attended more than half of the LTI sessions, earning them the 'LTI Advantageous' badge.</li>
</ul>
<p>Hoping to see all who attended and more back on Monday as we get ready for another week of great content from our clients (and us, too).</p>
<p>Now you know, I can't let the chance to write some code poetry pass by:</p>
<blockquote>
<p>DevCon – one week down.<br>
Full of tips, tricks, chits and chats.<br>
Earn those badges yet?</p>
</blockquote>]]></content>
        <author>
            <name>Scott Hurrey</name>
        </author>
        <category label="devcon" term="devcon"/>
        <category label="community" term="community"/>
        <category label="recap" term="recap"/>
    </entry>
</feed>