### 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`
```