### Sample API Request Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/confidential-application/tutorial This example demonstrates how to make a GET request to the SKY API, including the required Authorization and Bb-Api-Subscription-Key headers. ```APIDOC ## GET /constituents/280 ### Description Retrieves a specific constituent record from the SKY API. ### Method GET ### Endpoint https://api.sky.blackbaud.com/constituent/v1/constituents/{id} ### Headers - **Authorization**: Bearer [access_token] - **Bb-Api-Subscription-Key**: [subscription_key] ### Request Example ```http GET https://api.sky.blackbaud.com/constituent/v1/constituents/280 HTTP/1.1 Host: api.sky.blackbaud.com Authorization: Bearer eyJ0eXAiOiJKV1...CTtP0CQ Bb-Api-Subscription-Key: 77f137116...480d633 ``` ``` -------------------------------- ### Start the Application Server Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/confidential-application/code-samples/nodejs Execute this command in your project's working directory to start the application server. The server will be accessible at http://localhost:5000. ```bash $ npm start ``` -------------------------------- ### Install SKY Add-in Client Library Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/skyux-addin-getting-started Install the SKY Add-in Client library as a project dependency using npm. ```bash npm install --save-exact @blackbaud/skyux-lib-addin-client ``` -------------------------------- ### Example Page Add-in URL Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/page-addins An example URL demonstrating how to access a specific page add-in. The 'svcid' parameter determines the omnibar menu structure shown. ```url https://app.blackbaud.com/pages/applications/SKYAPPID/pages/my-page?envid=ENVID&svcid=renxt ``` ```url https://app.blackbaud.com/pages/applications/SKYAPPID/pages/my-page?envid=ENVID&svcid=renxt ``` -------------------------------- ### Install SKY UX Libraries Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/skyux-flyout Install the necessary SKY UX libraries for avatar, indicators, layout, lists, and list builder components. ```bash npm install @skyux/avatar npm install @skyux/indicators npm install @skyux/layout npm install @skyux/lists npm install @skyux/list-builder npm install @skyux/list-builder-view-grids ``` -------------------------------- ### OneRoster GET Categories for a class Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2023 Example response structure for the GET Categories for a class endpoint, returning an array of category objects for a given class ID. ```json [ { "categories": [] } ] ``` -------------------------------- ### OneRoster User Flags Metadata Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2023 Example of the nested metadata.microsoft.userFlags property in OneRoster API responses for GET Users all and GET Students all. This property indicates student accommodation statuses. ```json { "metadata": { "userFlags": "iep,ell" } } ``` -------------------------------- ### Initialize AddinClient Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/createaddin Instantiate the AddinClient class to enable interop with the host application. Call `args.ready()` to inform the host that the add-in is ready to be shown, optionally specifying a title. ```javascript // BBSkyAddinClient is global here. var client = new BBSkyAddinClient.AddinClient({ callbacks: { init: function(args) { // perform any initialization work here... // inform the host page that the add-in is ready to be shown args.ready({ showUI: true, title: 'My Custom Tile' }); } } }); ``` -------------------------------- ### Get Subscription Source: https://developer.blackbaud.com/skyapi/docs/webhooks/tutorial This example demonstrates how to retrieve the status of a specific webhook subscription using its ID. ```APIDOC ## GET /webhook/v1/subscriptions/{subscription_id} ### Description Retrieves the details and provisioning status of a specific webhook subscription. ### Method GET ### Endpoint `https://api.sky.blackbaud.com/webhook/v1/subscriptions/{subscription_id}` ### Headers - **Host**: `api.sky.blackbaud.com` - **Bb-Api-Subscription-Key**: `your_subscription_key` - **Authorization**: `Bearer your_access_token` ### Parameters #### Path Parameters - **subscription_id** (string) - Required - The ID of the subscription to retrieve. ### Response #### Success Response (200) - **id** (string) - The unique identifier of the subscription. - **provisioning_status** (string) - The current provisioning status of the subscription. #### Response Example ```json { "id": "f45fb280-6051-4c2c-994f-0ab574f8e203", "provisioning_status": "Provisioning" } ``` ``` -------------------------------- ### Complete HTML Structure for Add-in Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/hello-world This is the complete HTML file for the 'Hello World' add-in, including all necessary script references and UI elements. ```html

Hello world!

This is a simple custom tile ``` -------------------------------- ### C# Web Host Setup Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/confidential-application/code-samples/c-sharp This code initializes a web host using ASP.NET Core. It configures Kestrel as the web server, sets the content root, integrates with IIS, and specifies the startup class. This code runs server-side to protect application secrets. ```csharp using System.IO; using Microsoft.AspNetCore.Hosting; namespace Blackbaud.AuthCodeFlowTutorial { public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup() .Build(); host.Run(); } } } ``` -------------------------------- ### Initialize Add-in Client and Subscribe to Args Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/skyux-entry-form Initializes the add-in client and subscribes to arguments, including environment ID and UI readiness. ```typescript this.addinClientService.args.pipe( takeUntil(this.destroy) ).subscribe((args: AddinClientInitArgs) => { this.environmentId = args.envId; // initialize the tab args.ready({ showUI: true, title: Entry form demo }); }); ``` -------------------------------- ### Example School Level Object Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2024 This JSON object exemplifies the structure of a school level object returned by the GET Academics departments endpoint. ```json { "id": 1, "description": "Upper School", "abbreviation": "US" } ``` -------------------------------- ### Clone the starter project repository Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/confidential-application/code-samples/php Clone the sky-api-tutorial-auth-code-php repository from GitHub to get the starter project for this tutorial. ```git $ git clone https://github.com/blackbaud/sky-api-tutorial-auth-code-php.git ``` ```git $ git clone https://github.com/blackbaud/sky-api-tutorial-auth-code-php.git ``` -------------------------------- ### Get Subscription Response Source: https://developer.blackbaud.com/skyapi/docs/webhooks/tutorial This is an example of a successful response when retrieving subscription details. It includes the webhook URL, application ID, and event type. ```json Date: Fri, 24 Apr 2020 06:34:47 GMT Content-Length: 345 Content-Type: application/json; charset=utf-8 { "id": "f45fb280-6051-4c2c-994f-0ab574f8e203", "environment_id": "p-environment_id", "webhook_url": "https://example.org/bb/eventhandler", "application_id": "a056ca6b-a3a8-4ac7-b325-997666306e52", "event_type": "com.blackbaud.constituent.emailaddress.change.v1", "provisioning_status": "Provisioned" } ``` -------------------------------- ### OneRoster Users.csv Metadata Columns Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2023 Example of new metadata columns added to the `users.csv` file in OneRoster data exports, reflecting data from GET Users all. ```csv `metadata.grade` `metadata.stateId` `metadata.address1` `metadata.address2` `metadata.address3` `metadata.city` `metadata.state` `metadata.postCode` ``` -------------------------------- ### Complete HTML structure for the add-in Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/hello-world This is the complete HTML file for the 'Hello World' add-in, including necessary script and link tags for jQuery, ES6 Promise polyfill, SKY Add-in Client library, and custom JavaScript and CSS files. It also includes the UI elements for displaying context information and the user identity token. ```html

Hello world!

This is a very simple custom tile

The environment ID is a context value that is available to all add-ins:

Additional context values vary for each extension point - for constituent tiles, the ID of the constituent is provided:

Click the button to request a user identity token for the currently logged-in user

The following string represents the identity of the current user, and can be provided to the add-in's backend for validation:
``` -------------------------------- ### OneRoster Orgs.csv Metadata Columns Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2023 Example of new metadata columns added to the `orgs.csv` file in OneRoster data exports, reflecting data from GET Orgs all. ```csv `metadata.address1` `metadata.address2` `metadata.address3` `metadata.city` `metadata.state` `metadata.postCode` `Metadata.gradeRange` ``` -------------------------------- ### Sample SKY API Request Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/public-application/tutorial This is an example of how to make a GET request to the SKY API. Ensure you include the Authorization header with your Bearer token and the Bb-Api-Subscription-Key header. ```http GET https://api.sky.blackbaud.com/constituent/v1/constituents/280 HTTP/1.1 Host: api.sky.blackbaud.com Authorization: Bearer eyJ0eXAiOiJKV1...CTtP0CQ Bb-Api-Subscription-Key: 77f137116...480d633 ``` ```http GET /constituents/280 HTTP/1.1 Host: Authorization: Bearer eyJ0eXAiOiJKV1...CTtP0CQ Bb-Api-Subscription-Key: 77f137116...480d633 ``` -------------------------------- ### Complete HTML Structure for Add-in Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/hello-world The full HTML file structure for the 'Hello World' add-in, including necessary script includes for jQuery, ES6 Promise, SKY Add-in Client, and custom JavaScript and CSS files. ```html

Hello world!

This is a very simple custom tile

The environment ID is a context value that is available to all add-ins:

Additional context values vary for each extension point - for constituent tiles, the ID of the constituent is provided:
``` ```html

Hello world!

This is a very simple custom tile

The environment ID is a context value that is available to all add-ins:

Additional context values vary for each extension point - for constituent tiles, the ID of the constituent is provided:
``` -------------------------------- ### Game Time Object in Athletics Schedules Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2023 The Athletics schedules GET endpoint now includes a `game_time` object within schedule objects. This object contains `date`, `start`, `end`, and `duration` properties. ```json { "game_time": { "date": "2021-03-20T00:00:00Z", "start": "2023-08-16", "end": "2023-08-16", "duration": "2023-08-16" } } ``` -------------------------------- ### Clone the Authorization Code Flow Tutorial Repository Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/confidential-application/code-samples/nodejs This Git command clones the starter project for the Authorization Code Flow tutorial. This repository contains the necessary code structure to follow along with the guide. ```git $ git clone https://github.com/blackbaud/sky-api-auth-tutorial.git ``` -------------------------------- ### Sample SKY API Request with Authorization Header Source: https://developer.blackbaud.com/skyapi/docs/authorization/common-auth-issues This example demonstrates a GET request to the SKY API, including the necessary Authorization header with a Bearer token and the Bb-Api-Subscription-Key header. Ensure the token is correctly formatted with 'Bearer ' preceding the access token. ```http GET https://api.sky.blackbaud.com/constituent/v1/constituents/280 HTTP/1.1 Host: api.sky.blackbaud.com Authorization: Bearer eyJ0eXAiOiJKV1...CTtP0CQ Bb-Api-Subscription-Key: 77f137116...480d633 ``` ```http GET /constituents/280 HTTP/1.1 Host: Authorization: Bearer eyJ0eXAiOiJKV1...CTtP0CQ Bb-Api-Subscription-Key: 77f137116...480d633 ``` -------------------------------- ### Clone the C# .NET Core Starter Project Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/confidential-application/code-samples/c-sharp Clone the starter project from GitHub to work through the Authorization Code Flow tutorial. This command creates a local copy of the project files. ```git $ git clone https://github.com/blackbaud/sky-api-auth-tutorial-c-sharp.git ``` ```git $ git clone https://github.com/blackbaud/sky-api-auth-tutorial-c-sharp.git ``` -------------------------------- ### GET Inquiry list (Get) and GET Inquiry (Get) - User ID Added Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2025 The `user_id` property is now included in responses from GET Inquiry list (Get) and GET Inquiry (Get) if the inquiry was processed. This API is in PREVIEW. ```APIDOC ## GET Inquiry list (Get) and GET Inquiry (Get) - User ID Added ### Description For the `GET Inquiry list (Get)` and `GET Inquiry (Get)` endpoints, the `user_id` property is now included in the response if the inquiry has been processed. ### Method GET ### Endpoint - /Inquiry/list - /Inquiry/{inquiry_id} ### Response #### Success Response (200) - **user_id** (integer) - The ID of the candidate. Returns if the inquiry has been processed. ### Status These endpoints are in PREVIEW and may be changed or removed at any time. ``` -------------------------------- ### Candidate status added to GET Candidate list (Get) and GET Candidate (Get) Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2025 A new string property, `candidate_status`, has been added to the responses of GET Candidate list (Get) and Get Candidate (Get). It returns 'Active', 'Inactive', or 'Enrolled'. ```APIDOC ## GET Candidate list (Get) ### Description Retrieves a list of candidates. The response now includes the `candidate_status` property. ### Method GET ### Endpoint /candidates ### Response #### Success Response (200) - Returns a list of candidates, each with a `candidate_status` property (string: 'Active', 'Inactive', 'Enrolled'). ## GET Candidate (Get) ### Description Retrieves details for a specific candidate. The response now includes the `candidate_status` property. ### Method GET ### Endpoint /candidates/{candidate_id} ### Response #### Success Response (200) - Returns candidate details, including a `candidate_status` property (string: 'Active', 'Inactive', 'Enrolled'). ``` -------------------------------- ### Ready Event Information Source: https://developer.blackbaud.com/skyapi/products/bbms/payments/integrations/new-checkout/events/modal Example of the data structure returned when the 'ready' event is emitted. ```APIDOC ## Ready Event Information The following is an example of what is emitted by the `ready` event. ```json { "availablePaymentModes": [ "manualcard", "manualusbankaccount", "googlepay", "applepay", "paypal", "venmo" ] } ``` ```typescript export interface CheckoutModalReadyEvent { availablePaymentModes: PaymentMode[]; } ``` ``` -------------------------------- ### GET Candidate list (Get) - Inquiry ID Added Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2025 The `inquiry.id` property is now included in the response from GET Candidate list (Get). ```APIDOC ## GET Candidate list (Get) - Inquiry ID Added ### Description The `inquiry.id` property is now included in the response for the `GET Candidate list (Get)` endpoint. ### Method GET ### Endpoint /Candidate/list ### Response #### Success Response (200) - **inquiry** (object) - An object with candidate inquiry information. - **id** (integer) - The ID of the inquiry. ``` -------------------------------- ### Initialize SKY Add-in and Notify Host Source: https://developer.blackbaud.com/skyapi/docs/addins/common-issues Use this initialization logic to determine if the add-in should display and notify the host application when ready. Ensure the `init` callback receives the correct arguments and calls `ready` with appropriate options. ```javascript var client = new AddinClient({ callbacks: { init: (args) => { args.ready({ showUI: true, title: 'My Custom Tile Title' }); } } }); ``` -------------------------------- ### GET Athletics buildings renamed to GET Core buildings Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2025 The 'GET Athletics buildings' endpoint has been renamed to 'GET Core buildings'. ```APIDOC ## GET Core buildings ### Description Retrieves a list of core buildings. This endpoint was formerly known as GET Athletics buildings. ### Method GET ### Endpoint /core/buildings ### Response #### Success Response (200) - Returns a list of core buildings. ``` -------------------------------- ### School API - GET Core levels and GET Core roles Endpoints Updated Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2022 The GET Core levels endpoint has been renamed to GET Core school levels. Several user authorization roles have been added to both GET Core school levels and GET Core roles endpoints. ```APIDOC ## GET Core school levels ### Description Retrieves core school levels. This endpoint was previously named 'GET Core levels'. Additional user authorization roles have been added. ### Method GET ### Endpoint `/schools/levels` ``` ```APIDOC ## GET Core roles ### Description Retrieves core roles. Additional user authorization roles have been added. ### Method GET ### Endpoint `/roles` ``` -------------------------------- ### Initialize SKY Add-in Client Source: https://developer.blackbaud.com/skyapi/docs/addins/concepts/extension-points Demonstrates how to initialize the SKY Add-in Client and access context values within the `init` callback. The `args.context` object provides runtime information, such as the `recordId` for most extension points. ```javascript // BBSkyAddinClient is global here. var client = new BBSkyAddinClient.AddinClient({ callbacks: { init: (args) => { // the context values are provided as part of the args object context = args.context; // most extension points provide the current record ID currentRecordId = context.recordId; ... } } }); ``` ```javascript // BBSkyAddinClient is global here. var client = new BBSkyAddinClient.AddinClient({ callbacks: { init: (args) => { // the context values are provided as part of the args object context = args.context; // most extension points provide the current record ID currentRecordId = context.recordId; ... } } }); ``` -------------------------------- ### Clone the Angular Tutorial Repository Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/public-application/code-samples/angular Clone the starter project for the Authorization Code Flow for a public application using Angular. This repository contains the code necessary for the tutorial. ```git $ git clone https://github.com/blackbaud/sky-api-tutorial-public-application-angular ``` ```git $ git clone https://github.com/blackbaud/sky-api-tutorial-public-application-angular ``` -------------------------------- ### Candidate List (Get) now supports pagination Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2024 The GET Candidate list (Get) endpoint now supports pagination using the optional `size` or `page` parameters in the request body. ```APIDOC ## GET Candidate list (Get) ### Description Retrieves a list of candidates, now supporting pagination. ### Method GET ### Endpoint /candidate/list ### Parameters #### Query Parameters - **size** (integer) - Optional - The number of results to return per page. Defaults to 3000. - **page** (integer) - Optional - The page number to retrieve. ``` -------------------------------- ### Initialize Button Add-in with Callbacks Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/hello-world-button Configure the add-in client with init and buttonClick callbacks. The init callback prepares the button's UI, and buttonClick is set to a function that will be called when the button is clicked. ```javascript (function () { // Add-in code goes here // BBSkyAddinClient is global here. var client = new BBSkyAddinClient.AddinClient({ callbacks: { init: function(args) { // perform any initialization needed for the add-in // when the button is ready to be shown, inform the host page args.ready({ showUI: true, title: 'Add customer', buttonConfig: { style: BBSkyAddinClient.AddinButtonStyle.Add } }); }, buttonClick: showAddCustomerModal } }); }()); ``` -------------------------------- ### GET Request Helper Function Source: https://developer.blackbaud.com/skyapi/docs/authorization/auth-code-flow/confidential-application/code-samples/nodejs A helper function to simplify making GET requests using the `proxy` function. It sets the HTTP method to 'GET' and passes an empty string for the body. ```javascript function get(request, endpoint, callback) { return proxy(request, 'GET', endpoint, '', callback); } ``` ```javascript function get(request, endpoint, callback) { return proxy(request, 'GET', endpoint, '', callback); } ``` -------------------------------- ### Initialize Add-in and Show Modal Source: https://developer.blackbaud.com/skyapi/docs/addins/get-started/hello-world-button Initializes the add-in client and defines the button's behavior to show a modal when clicked. The modal is configured with a URL and context data. ```javascript BBSkyAddinClient.initialize(function(client) { client.registerAddin({ load: function(args) { // when the button is ready to be shown, inform the host page args.ready({ showUI: true, title: 'Add customer', buttonConfig: { style: BBSkyAddinClient.AddinButtonStyle.Add } }); }, buttonClick: showAddCustomerModal }); function showAddCustomerModal() { // define context for the modal var context = { firstName: 'John', lastName: 'Doe' }; client.showModal({ url: 'https://host.nxt.blackbaud.com/addin-modal-demo/add-customer', context: context }); } }()); ``` -------------------------------- ### OneRoster API - New Endpoints for Classes, Teachers, and Students Source: https://developer.blackbaud.com/skyapi/support/changelog/bbem/2022 Three new endpoints have been added to the OneRoster API: GET Classes for a teacher, GET Teachers for a class, and GET Students for a class. ```APIDOC ## GET Classes for a teacher ### Description Returns a collection of class objects that match the required `teacher_id` parameter. ### Method GET ### Endpoint `/teachers/{teacher_id}/classes` ``` ```APIDOC ## GET Teachers for a class ### Description Returns a collection of teacher objects that match the required `class_id` parameter. ### Method GET ### Endpoint `/classes/{class_id}/teachers` ``` ```APIDOC ## GET Students for a class ### Description Returns a collection of student objects that match the required `class_id` parameter. ### Method GET ### Endpoint `/classes/{class_id}/students` ```