---
language: "en"
---
# Documentation

qibb is an integration platform with ready-to-use building blocks for media workflows. Plan, build and run modular solutions for professional media with qibb, using best-in-class integrations and pre-built workflows for your required use case.  
![qibb-docs-grafic-hd.gif](https://docs.qibb.com/__attachments/a_a375c928e46e12c4e0b73ee41696ce3eed9ed8afbd206791c9f1d3baa6520599/qibb-docs-grafic-hd.gif?cb=2c60ffa90273f501520f34c444da640b)  
* [Apps](https://docs.qibb.com/platform/apps.md)
* [Spaces](https://docs.qibb.com/platform/spaces.md)
* [Dashboards](https://docs.qibb.com/platform/dashboards.md)
* [Clusters](https://docs.qibb.com/platform/clusters.md)
* [AI Copilot](https://docs.qibb.com/platform/ai-copilot.md)
* [Flows](https://docs.qibb.com/platform/flows.md)
* [Nodes](https://docs.qibb.com/platform/nodes.md)
* [Identity \& Access](https://docs.qibb.com/platform/identity-access.md)
* [Catalog](https://docs.qibb.com/platform/catalog.md)
* [Architecture](https://docs.qibb.com/platform/architecture.md)
* [API](https://docs.qibb.com/platform/api.md)
* [Monitoring \& Observability](https://docs.qibb.com/platform/monitoring-observability.md)
* [Glossary](https://docs.qibb.com/platform/glossary.md)
* [Academy](https://docs.qibb.com/platform/academy.md)
* [Releases](https://docs.qibb.com/platform/releases.md)
* [Recent Documentation Updates](https://docs.qibb.com/platform/recent-documentation-updates.md)
* [Legal docs](https://docs.qibb.com/platform/legal-docs.md)

---
language: "en"
---
# Academy

* [Tutorials](https://docs.qibb.com/platform/tutorials.md)

  Tutorials section with easy-to-follow step-by-step guides
* [Assignments](https://docs.qibb.com/platform/assignments.md)

  The assignments section contains tasks designed to help you apply your newly acquired knowledge and skills practically.

---
language: "en"
---
# Account

Standard Premium ULTIMATE

Users can perform certain actions in context of their account, such as changing their password or personal settings.

## Next Steps

As a next step, you might want to check [Profile](https://docs.qibb.com/platform/profile.md) !

## Related articles

* [Profile](https://docs.qibb.com/platform/profile.md)

  Learn how to edit your profile and reset password.
* [Sessions](https://docs.qibb.com/platform/sessions.md)

  Learn how to look up user activity by sessions from user account.

---
language: "en"
---
# Accurate.Video

## Introduction

**Accurate.Video** brings the applications to the content, enabling browser-based workflows and advanced media features.

It's specifically designed for collaborative professional media workflows with time-based metadata in mind. **Accurate.Video** provides three predefined validation workspaces focused on specific use cases, and additionally the interface can be tailored to your specific needs.

You can find more details and the supported operations at [Accurate.Video \| qibb Catalog](https://www.qibb.com/integrations/accurate-video/)**.**

## How to get started with Accurate.Video integration

Before you get started with the **Accurate.Video** integration, please make sure that you have the needed permissions for those operations.

1. You will need an **API Key** . You can request one from Accurate.Video via <https://www.codemill.se/contact>.

2. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install the **Accurate.Video** node by clicking on the **+** button.

3. Drag and drop the **Accurate.Video**node and any other necessary nodes from the left sidebar to your flow and connect them.

4. Open the **Accurate.Video** node, expand the **Connection** dropdown (the first dropdown), and enter your **API Key** in the connection settings. Then select an operation to start using the integration.

   ![image-20251222-104225.png](https://docs.qibb.com/__attachments/a_1d6c1c2c605c53df9b0ea238099c54801072136e17015f8f8b64109fe11debc9/image-20251222-104225.png?cb=36fb231d4409be837800877de58b7b83)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Add job management capabilities to your flow with checkpoints

This document outlines the functionality and benefits of qibb's **Job Management** capabilities, enabled by [**Checkpoint Nodes**](https://docs.qibb.com/platform/checkpoints.md) strategically placed within your flows. This feature empowers you with enhanced job tracking, monitoring, and control, providing granular management over job processing for increased reliability and flexibility.
Minimum Version Requirements for Job Management Features  
**Minimum Version Requirements**

Latest generation of Job Management:

* **Checkpoint Nodes** based on `qibb-checkpoint-nodes v4.0.X` require your app to be running on `flow v5.0.0` or higher. Please ensure your app is up-to-date before installing these nodes. See [flow v5.0.0](https://docs.qibb.com/platform/flow-v5-0-0.md) for further information.

* **Job management** features in the Portal require the platform to be running on `qibb v1.45.0` or higher.

Previous generation of Job Management:

* **Checkpoint Nodes** based on `qibb-checkpoint-nodes v3.X.X` require your app to be running on `flow v4.0.0` or higher. Please ensure your app is up-to-date before installing these nodes. See [flow v4.0.0](https://docs.qibb.com/platform/flow-v4-0-0.md) for further information.

* **Job management** features in the Portal require the platform to be running on `qibb v1.43.0` or higher.

## Understanding Checkpoint Nodes

qibb's [Checkpoint Nodes](https://docs.qibb.com/platform/checkpoints.md) act as control points within your flow, allowing you to observe and manipulate jobs as they progress. They provide a robust framework for managing the lifecycle of your jobs, from initiation to completion or termination.

### Key Capabilities

Here's a breakdown of the powerful controls offered by Checkpoint Nodes:

* **Job Checkpoints:** Clearly mark significant stages in your job's journey, such as the start, intermediate progress points, and final completion for success and failure cases. This provides a visual and auditable trail of execution.

* **Job Scheduling \& Timeouts:** Plan the execution of individual jobs for a future time and define maximum execution durations. Jobs exceeding these timeouts can be automatically flagged as failed.

* **Retries \& Cancellation:** Implement automatic retry mechanisms for failed jobs, with configurable limits and backoff strategies. You also have the ability to manually retry or cancel jobs as needed.

* **Queue Management:** Optimize job processing with features like priority queuing (processing higher-priority jobs first), rate limiting (controlling the rate of jobs leaving a checkpoint), and the ability to temporarily pause and resume checkpoint queues.

* **Approval-Based "Wait" Checkpoints:** Introduce manual approval steps into your flow. Jobs reaching a "Wait" checkpoint will be held until explicitly released via user interface in the Portal, an injected message command in the flow or API call.

* **Browse \& Search:** Effortlessly track and analyze all jobs of an app through a dedicated interface in the qibb Portal, offering multiple filters and full-text search capabilities. This includes searching across job metadata and the complete job lifecycle. For audit purposes, you can inspect the event history and snapshotted message properties for each job.

### Benefits of Using Checkpoint Nodes

Integrating Checkpoint Nodes into your flows offers several significant advantages:

* **Enhanced Job Tracking:** Gain complete visibility into the status and progression of your jobs.

* **Improved Reliability:** Implement automatic retries and timeouts to handle transient failures and prevent indefinite job hangs.

* **Increased Control:** Manually intervene in job processing through cancellation, retries, and approval mechanisms.

* **Optimized Resource Utilization:** Manage concurrent job execution with rate limiting and prioritize critical tasks with priority queuing.

* **Greater Flexibility:** Schedule jobs for future execution and introduce manual approval steps for critical processes.

* **Resilience:** Jobs persist through platform downtime or upgrades, ensuring continuity of processing. Stalled jobs are automatically flagged for attention.

* **Comprehensive Auditing:** Maintain a detailed history of job progression at each checkpoint, including custom metadata.

### Using Checkpoint Nodes in Your Flows

When designing your flows, you can strategically place different types of checkpoint nodes to implement the desired control mechanisms:

* **Start Checkpoint:** Typically placed at the beginning of a job's flow. It can handle automatic retries for failed jobs.

* **Update Checkpoint:** Used to mark progress or intermediate stages of a job. Supports pausing and resuming the queue.

* **Wait Checkpoint:** Holds incoming jobs until they are manually or programmatically released.

* **Success Checkpoint:** Indicates the successful completion of a job.

* **Fail Checkpoint:** Indicates the failed completion of a job.

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ![jobs_in_portal.png](https://docs.qibb.com/__attachments/a_274f405291d51a8146d0198ba91a44c05cc4008d8ce7b1a519560924333edf7e/jobs_in_portal.png?cb=e82438bbb269ca0ae526e036d746c873) Jobs can be viewed and managed from the Portal | ![checkpoints_media_flow_example.png](https://docs.qibb.com/__attachments/a_d1f677651bc674f765d31a53cf88e18a740fd8cf69b342fdeecf13924ec5e4d2/checkpoints_media_flow_example.png?cb=97815c08919ea77c53e0512d0793c449) Example flow of using checkpoints along a typical media flow involving wait/approval steps | ![checkpoints.png](https://docs.qibb.com/__attachments/a_d2f4fed57488e713367b413b40ca6c818fe8428cc637418db604e8b61f9198b2/checkpoints.png?cb=4c502c8d0b545df3c6ca75ef1571d604) Example flow with commands to control checkpoints such as pausing/resuming a checkpoint |

### Managing Jobs in the Portal

The qibb Portal provides a dedicated interface for managing jobs processed through Checkpoint Nodes at the space level:

* **Job Overview:** View a comprehensive list of jobs with their current status, description, and relevant metadata.

* **Filtering and Searching:** Utilize multiple filters (e.g., status, checkpoint, creation time) and full-text search to quickly locate specific jobs.

* **Job Actions:** Perform control actions on individual jobs, including:

  * **Approve:** Release jobs held at "Wait" checkpoints.

  * **Retry:** Manually trigger a retry attempt for a failed job.

  * **Cancel:** Terminate a pending or running job.

  * **Delete:** Remove a job from the system.

  * **Edit:** Modify certain job properties (if supported).

### Implementation Details and Considerations

* **Resilience:** Checkpoints ensure job persistence during downtime and app upgrades. Automatic retry rules aid in recovering from failures. The platform's architecture minimizes dependencies, allowing job and queue operation even during network disruptions. Cluster backups provide disaster recovery for job states and queues.

* **Pause \& Resume Checkpoints:** Start and Update Checkpoints can be paused and resumed via message commands, temporarily halting or restarting job processing at that point.

* **Approve Jobs:** "Wait" Checkpoints hold jobs until a release command is issued through the UI or API.

* **Cancel Jobs:** Jobs can be canceled individually using a specific message command referencing the job ID.

* **Delete Jobs:** Individual jobs can be permanently removed using a message command with the job ID.

* **Schedule Jobs:** Jobs can be scheduled for future execution by including an ISO date string in the `msg.scheduled_at` property.

* **Time Outs for Jobs:** Define a timeout period in seconds using the `msg.timeout_in_sec` property. Jobs exceeding this duration from their creation time will be flagged as failed.

* **Priority Queuing:** Assign a priority level to jobs using the `msg.priority` property (higher number indicates higher priority). The queue will dynamically reorder to process higher-priority jobs first.

* **Rate Limiting:** Configure the maximum number of jobs concurrently leaving a checkpoint (options: 1, 10, 50, 100 jobs/second).

* **Automatic Retry for Jobs:** The Start Checkpoint can be configured to automatically retry failed jobs. Configure the maximum number of attempts in the node properties. The original message at the time of job creation will be re-injected during retry.

* **Manual Retry for Jobs:** Trigger a manual retry for a specific job ID via a message command. This bypasses the automatic retry limits, allowing for troubleshooting.

* **Job Tracking:** The system automatically tracks job status (pending, running, success, fail) along with relevant metadata and a history of checkpoint transitions. Custom metadata structures for external IDs are also supported.

* **Flow Editor Interface:** The flow editor provides visual indicators and interactive elements for Checkpoint Nodes:

  * See the current queue count for each checkpoint in the node status label.

  * View the job queue of a checkpoint in the debug sidebar.

  * Perform actions like deleting, canceling, releasing, pausing, resuming, manually retrying, and scheduling jobs using inject nodes with specific commands.

  * Configure rate limits per checkpoint.

  * Configure automatic retry attempts for the Start Checkpoint (For other checkpoint types, the setting will be ignored.)

* **Automatic Cleanup of Jobs:** Future updates will introduce automatic deletion of old jobs based on configurable data retention policies to manage storage and prevent overflow.

**Flows triggered by HTTP requests (via HTTP-in node) are supported by checkpoints under the following restrictions:**

To leverage all checkpoint features, immediately handle incoming HTTP requests and remove the `msg.res` object before the message reaches the first checkpoint. Otherwise certain features will be automatically disabled, including queuing, rate limiting, wait/approve, and retries for that specific job, and a warning will be displayed in the debug sidebar. Jobs with the `msg.res` object will bypass queues and paused checkpoints.

### Custom Metadata and Job Events

Checkpoint Nodes provide powerful capabilities for auditing and tracking your jobs, primarily through the use of custom metadata and automatically generated job events.

#### **Custom Metadata for Enhanced Tracking**

You can enrich your job records with custom metadata by adding properties to the `msg` object (e.g., `msg.payload.customer_id`, `msg.asset.file_type`). This allows you to store specific business-relevant information alongside your job.

Beyond arbitrary custom fields, qibb also supports a set of **standardized metadata fields** within `msg.qibb` for common tracking needs:

* `owner_id`, `owner_name`, `owner_url`

* `asset_id`, `asset_name`, `asset_url`

* `external_id`, `external_name`, `external_url`

These standardized fields are specifically displayed in a dedicated column of the **Jobs Table within the qibb Portal** and are searchable, making it easier to filter and find jobs related to particular external systems, assets, or owners. Custom metadata (both standardized and user-defined) enhances job searchability, provides crucial context in the Portal, and forms a key part of your job's auditable trail.

#### **Comprehensive Job Event History**

As jobs progress through Checkpoint Nodes, the system automatically generates **job events**. Each event records a significant transition or action in the job's lifecycle, such as:

* **CREATED:** When a job is initiated at a Start Checkpoint.

* **STARTED:** When a job begins leaves a Start Checkpoint.

* **CHECKED_OUT:** When a job leaves an Update checkpoint.

* **WAIT:** When a job enters a Wait Checkpoint.

* **APPROVED:** When a job is released from a Wait Checkpoint.

* **SCHEDULED_FOR_RETRY:** When a job is scheduled for a retry attempt.

* **SUCCEEDED:** When a job reaches a Success Checkpoint.

* **FAILED:** When a job reaches a Fail Checkpoint or times out.

* **CANCELLED:** When a job has been cancelled by a command or user action.

* **DELETED:** When a job has been deleted by a command or user action.

Each event typically includes:

* Timestamp of the event.

* The `job_id` and the `checkpoint_id`/`name`/`type` it occurred at.

* The `queue_type` and `job_state` at the time of the event.

* A plain-text summary of the event.

* A snapshot of the `msg` object (Only if Event Data Storage is set to "Full")

* The current `attempt` number for the job.

#### **Configurable Event Data Storage**

To manage storage consumption, you can configure the level of detail stored for each job event via the `EVENT_DATA_STORAGE` setting:

* **'Compact'**: Stores only essential event metadata, suitable for general tracking and auditing.

* **'Full'** : Includes a complete snapshot of the `msg` object at the time the event occurred. This provides deep debugging capabilities by allowing you to inspect the message content at any point in the job's history, but consumes significantly more storage.

## Control Commands

The Checkpoint node can be controlled by sending it a message with a `msg.control_cmd` property. These commands allow for dynamic management of the queue and individual jobs.  

|         **Command**          |                                                                                                                                                                                             **Description**                                                                                                                                                                                             | **Applies to Checkpoint Type** |                                                                                                                                                                                   **Example msg**                                                                                                                                                                                   |
|------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **PAUSE_CHECKPOINT**         | Pauses the checkpoint, preventing it from processing new jobs from its queue.                                                                                                                                                                                                                                                                                                                           | `START`, `UPDATE`              | `{"control_cmd": "PAUSE_CHECKPOINT"}`                                                                                                                                                                                                                                                                                                                                               |
| **RESUME_CHECKPOINT**        | Resumes a paused checkpoint, allowing it to continue processing jobs.                                                                                                                                                                                                                                                                                                                                   | `START`, `UPDATE`              | `{"control_cmd": "RESUME_CHECKPOINT"}`                                                                                                                                                                                                                                                                                                                                              |
| **PUSH_JOB_EVENT**           | Adds a custom event to a specific job's history. Requires `qibb.job_id`, `payload.summary_plain_text`. Can also contain optional `payload.summary.msg`.                                                                                                                                                                                                                                                 | All                            | { "control_cmd": "PUSH_JOB_EVENT", "qibb.job_id": "...", "payload": { "summary_plain_text": "Custom update.", "msg" : { "hello": "world", "transcoding_progress": "50%" } } }                                                                                                                                                                                                       |
| **GET_GROUPED_QUEUE_LIST**   | Retrieves a list of queued jobs, grouped by queue type (`IMMEDIATE`, `SCHEDULED`, etc.). The result is sent to the node's second output.                                                                                                                                                                                                                                                                | All                            | `{"control_cmd": "GET_GROUPED_QUEUE_LIST"}`                                                                                                                                                                                                                                                                                                                                         |
| **GET_FLAT_QUEUE_LIST**      | Retrieves a single flat list of all queued jobs. The result is sent to the node's second output.                                                                                                                                                                                                                                                                                                        | All                            | `{"control_cmd": "GET_FLAT_QUEUE_LIST"}`                                                                                                                                                                                                                                                                                                                                            |
| **RESET_QUEUE**              | Deletes all jobs currently queued at this specific checkpoint.                                                                                                                                                                                                                                                                                                                                          | All                            | `{"control_cmd": "RESET_QUEUE"}`                                                                                                                                                                                                                                                                                                                                                    |
| **DELETE_JOB**               | Permanently deletes a single job from the database, regardless of its state. Requires `qibb.job_id`.                                                                                                                                                                                                                                                                                                    | All                            | `{"control_cmd": "DELETE_JOB", "qibb": {"job_id": "..."}}`                                                                                                                                                                                                                                                                                                                          |
| **CANCEL_JOB**               | Cancels a job, setting its state to `CANCELLED`. Requires `qibb.job_id`.                                                                                                                                                                                                                                                                                                                                | All                            | `{"control_cmd": "CANCEL_JOB", "qibb": {"job_id": "..."}}`                                                                                                                                                                                                                                                                                                                          |
| **RETRY_JOB**                | Manually retries a `FAILED`, `STALLED`, or `CANCELLED` job. Requires `qibb.job_id`.                                                                                                                                                                                                                                                                                                                     | `START`                        | `{"control_cmd": "RETRY_JOB", "qibb": {"job_id": "..."}}`                                                                                                                                                                                                                                                                                                                           |
| **RELEASE_WAITING_JOB**      | Releases a single job held at a `WAIT` checkpoint. Requires `qibb.job_id`. Optionally, set `"control_target": "GLOBAL"` to release the waiting job regardless of which checkpoint it is currently holding it. This allows the release action to be connected to a different checkpoint, or even a dummy checkpoint, making it easier to build clean, centralized release logic to release waiting jobs. | `WAIT`                         | The following releases a waiting job only if it's hold by the checkpoint node which receives the command: `{"control_cmd": "RELEASE_WAITING_JOB", "qibb": {"job_id": "..."}}` The following releases a waiting job regardless of which checkpoint node receives the command: `{` `"control_cmd": "RELEASE_WAITING_JOB", "control_target":"GLOBAL",` `"qibb": {"job_id": "..."}` `}` |
| **RELEASE_ALL_WAITING_JOBS** | Releases all jobs currently held at a `WAIT` checkpoint.                                                                                                                                                                                                                                                                                                                                                | `WAIT`                         | `{"control_cmd": "RELEASE_ALL_WAITING_JOBS"}`                                                                                                                                                                                                                                                                                                                                       |
| **CLEAN_DATABASE**           | Deletes all jobs from the database. Requires a `confirm` property to prevent accidental use. Use cautiously.                                                                                                                                                                                                                                                                                            | All                            | `{"control_cmd": "CLEAN_DATABASE", "confirm": "DELETE_ALL_JOBS"}`                                                                                                                                                                                                                                                                                                                   |

## Reactivity and Timing of Checkpoints

Checkpoint Nodes leverage an internal, asynchronous scheduler to manage job queues, process events, and maintain job states. This design ensures robustness and resilience, but it also means that job processing is not instantaneous. Understanding the timing characteristics of the two available queue modes is essential for optimizing your flows.

### Understanding the Two Queue Modes

The most significant configuration for a Checkpoint is its **Queue Mode**. This choice fundamentally changes how jobs are ingested, processed, and sent to the next node.  

|        **Queue Mode Option**        |                                                                 **How it Works**                                                                  |                     **Output Pattern**                     |                                       **Best Use Case**                                        |
|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|------------------------------------------------------------------------------------------------|
| Batch Burst (Durable) DEFAULT       | Persists all jobs to the database *first*, then the adaptive scheduler releases the entire queue in a single, powerful operation.                 | All jobs in a batch are sent out at roughly the same time. | Processing entire datasets as a single unit; ensuring no data is lost on crash; critical jobs. |
| Steady Stream (High-Throughput) NEW | Buffers jobs in memory and releases them at a constant, configured rate (e.g., 10 per second). Jobs are written to the database as they are sent. | A smooth, steady flow of individual jobs.                  | High-volume APIs; preventing downstream overload; fastest latency for non-batch traffic.       |

### How Checkpoints Process Jobs

#### **1. Core Queue Processing**

* **In Batch Burst Mode:** The checkpoint periodically evaluates its internal database queue. The frequency of this check dynamically adapts: it speeds up when there are many jobs waiting (as often as every 3 seconds) and slows down when the queue is empty (up to every 15 seconds), releasing all ready jobs in one go.

* **In Steady Stream Mode:** The checkpoint uses a fixed-interval scheduler (typically every 1 second) to process its in-memory buffer. It sends out a number of jobs that adheres to the configured `RATE_LIMIT`, creating a predictable, constant flow rather than a burst.

#### **2. High-Volume Ingestion**

* **In Batch Burst Mode:** To ensure durability, incoming jobs are collected in a temporary batch. When this batch meets a threshold (e.g., 50 messages) or a time limit is reached (e.g., 5 seconds), the entire batch is written to the database queue for persistence before it is considered for processing.

* **In Steady Stream Mode:** Incoming jobs are added to a lightweight in-memory buffer with minimal overhead. They are only persisted to the database at the moment they are processed and sent out of the node by the rate-limiter.

#### **3. Common Scheduled and Maintenance Tasks**

The following background tasks run independently of the chosen queue mode and apply to specific checkpoint types:

* **Scheduled Jobs (** `Start`**Checkpoints):** The scheduler periodically checks for jobs with a `msg.qibb.scheduled_at` time. Once the schedule arrives, jobs are moved into the appropriate queue (`IMMEDIATE` for Batch Burst, or the in-memory buffer for Steady Stream). Expect a delay of 5 seconds to a minute for jobs to be picked up after their scheduled time.

* **Automatic Retries (** `Start`**Checkpoints):** When a job fails, the Start Checkpoint re-schedules it for a future retry using an exponential backoff strategy (e.g., 10s, 20s, 40s...). The scheduler checks for jobs to retry approximately every 30 seconds.

* **Waiting Jobs (** `Wait`**Checkpoints):** `Wait` Checkpoints inherently operate in a burst-like fashion. Jobs are held durably in a `WAITING` state. When approved, they are moved to the `IMMEDIATE` queue and are picked up by the scheduler in the next processing burst, typically within 5 to 60 seconds.

* **Flagging Stalled Jobs (** `Start`**Checkpoints):** The system periodically (approx. every 5 minutes) identifies jobs that have been in a `RUNNING` state for too long (default: 5 minutes) and automatically flags them as `STALLED` for review.

### **Latency and Responsiveness**

Your choice of queue mode directly impacts the latency profile of your flow:

* **Batch Burst Latency (The "Floodgate"):** Jobs experience a predictable delay while they are queued, determined by the adaptive scheduler's interval (3-15 seconds). The key benefit is that all jobs in a large batch will have a **similar latency** and will be delivered as a cohesive group. The system is highly reactive to load, as the processing interval shortens automatically to clear backlogs faster.

* **Steady Stream Latency (The "Conveyor Belt"):** This mode offers the **lowest possible latency for the first job** in a batch (typically \~1 second). However, for a large batch, the last job will have a higher latency as it waits its turn on the conveyor belt (e.g., in a batch of 50 with a rate limit of 10/s, the last job will have a latency of \~5 seconds). This mode provides excellent responsiveness for single messages and smooths out large bursts to protect downstream systems.

**Performance Tip: Consider the Bigger Picture**

Remember, the performance of any Checkpoint is influenced by its environment. An undersized [**app size**](https://docs.qibb.com/platform/picking-the-right-size-for-your-flow-app.md) or a heavy, concurrent workload in other parts of your flow can impact processing speed of jobs and increase latency. Always consider the overall system load when tuning your checkpoints.

---
language: "en"
---
# Adding members to a dashboard

**Manage access to dashboards**

You can make a dashboard accessible to others by adding them as members. By default, only the creator and platform admins can access a newly created dashboard.

Access levels are determined by assigned membership roles.

For a detailed list of membership roles, see [Manage access to Dashboards](https://docs.qibb.com/platform/manage-access-to-dashboards.md) .

## Manage Members of a Dashboard

To share a dashboard, you must be an **Owner**. Follow these steps:

1. Navigate to the **Dashboard** detail page.

2. Click the `...` button in the top right corner.

3. Select **Manage Members** from the dropdown menu.

4. A dialog will display a list of identities and their roles for this dashboard.

5. Click the **+** button to add a member or the **pen icon** to edit a member's role.

6. Select the user or group and the role to grant.

7. Click the ✔ **Confirm** button to apply the changes.

8. Close the dialog by clicking the **Close** button.

---
language: "en"
---
# Adding members to a Space

## Manage Members of a Space

**Manage access to spaces and apps**

A space can be made accessible to other identities by adding them as members. By default, a newly created space is only accessible to its creator and admins.

Members can perform specific actions within the space and manage apps based on their assigned roles.

For a detailed list of membership roles, see [Manage access to Spaces and their Apps](https://docs.qibb.com/platform/manage-access-to-spaces-and-their-apps.md).

To share a Space, you must be an **Owner**. Follow these steps:

1. Navigate to the **Space** detail page.

2. Click the **Manage Members** button in the top right corner.

3. A dialog will display a list of identities and their roles for this space.

4. Click the **+** button to add a member or the **pen icon** to edit a member's role.

5. Select the user or group and the role to grant.

6. Click the ✔ **Confirm** button to apply the changes.

7. Close the dialog by clicking the **Close** button.

![image-20220211-103934.png](https://docs.qibb.com/__attachments/a_1b99900a170b53b6cc1f3e1c403a135899d7485746788583d5cb8ca8777bcfca/image-20220211-103934.png?cb=21e6850e7d3c5a26c4730e1edaac6815)
Select the Role of the Group or the User

---
language: "en"
---
# Adding user to a group

ULTIMATE

To assign a group to a user, the following steps are required:

1. Navigate to the **Users**page.

2. The user, which should be added to a group, can be found using the list or with the help of the filter function.

   ![image-20220112-131304.png](https://docs.qibb.com/__attachments/a_c181374eb4c6576d0695d417e0763e0a123550e148d32254392f0f5efeedf18a/image-20220112-131304.png?cb=45099165637ff22ebc7c05abf9aa2373)
   Adding a user to a group - Find a user in the Users list
3. Select the user

4. Navigate to the top of the web browser and select **Groups** from the tabs as indicated in the image

   ![image-20220112-131532.png](https://docs.qibb.com/__attachments/a_9831d919e2a51a0d04f5a30e6640f6854b9f65d6232be5f97f5f78424432fb3c/image-20220112-131532.png?cb=f3db41241bf9b0488f371cbc39f100bb)
   Adding users to a group - User dashboard

5. Search for a specific group from the list of available groups via the table or using the filter

   ![image-20220112-131936.png](https://docs.qibb.com/__attachments/a_c47d10768e1900b4f50cc6486711414e5f11de13bde96199ac3dc7cc7c85fe8c/image-20220112-131936.png?cb=20e74407f32e26d6e5e84075252a8a63)
   Adding a user to a group - Assigning a group to the user   
6. Select the group and click **Add Selected**

The user should now be visible in the group as assigned and inherit all permissions assigned to the group.  
![image-20220112-131813.png](https://docs.qibb.com/__attachments/a_361ca25c4885623ba9d4547efb1d6f70dafb63ab8d4f3a13d26798f68f23d857/image-20220112-131813.png?cb=b4363158b07bd8ea693d94c176e4a6c5)

Alternative ways to manage the user's roles and permissions when no group has been set up can be found here:

* [Assigning roles to a group](https://docs.qibb.com/platform/assigning-roles-to-a-group.md)

* [Assigning roles to a user](https://docs.qibb.com/platform/assigning-roles-to-a-user.md)

## Next Steps

Now you can [manage members of the group](https://docs.qibb.com/platform/managing-members-of-a-group.md) and [move the group within the tree](https://docs.qibb.com/platform/moving-a-group-within-the-tree.md) if you wish to inherit more permissions.

---
language: "en"
---
# Adding widgets to a dashboard

Widgets are items you can place on the dashboard grid. They can be freely moved and resized on the grid. Depending on the widget, you will have a variety of configuration options to control its content.  
![Dashboard edit-view](https://docs.qibb.com/__attachments/a_a1d3fa1472d5102956bb7970227c90ebcf2e83c98463364b0600666f683744c3/image-20220201-115157.png?cb=cd0857fae92adaa4b52dd0772947ae5a)
Configuring a dashboard

Adding widgets to the dashboard involves the following steps:

1. While viewing a dashboard, click on the **Edit**button in the top right corner to unveil the grid and widget library.

2. The widget library will be presented on the left side.

3. Click on the **+** Button of the widget you would like to add to the grid. The widget can additionally be dragged and dropped to the required position.

4. Fill in the required input to configure the widget.

5. Click on **Confirm**. The widget will appear on the grid.

6. Publish your changes made to the dashboard by clicking on **Save** in the top right corner.

---
language: "en"
---
# Adobe Photoshop

## Introduction

**Adobe Photoshop API** allows users to integrate the functionality of Adobe Photoshop into their own applications or workflows. **Adobe Photoshop API** provides access to a wide range of image editing and manipulation features, such as layer management, filters, transformations, and text editing, enabling them to build applications that leverage Photoshop's capabilities.

With **Adobe Photoshop API** you can process images, remove backgrounds, adjust lighting and more, automatically and programmatically. It is also possible to create mockups of products using smart object replacement, and crop products automatically from larger images.

**Adobe Photoshop API** also supports the integration of third-party tools, libraries, and services, making it possible to extend Photoshop's capabilities further and streamline integration with other creative tools or services.

You can find more details and the supported operations on [Adobe Photoshop \| qibb Catalog.](https://www.qibb.com/integrations/adobe-photoshop/)

## How to get started with Adobe Photoshop API integration

Before you get started with the **Adobe Photoshop API** integration, please make sure that you have the needed permissions for those operations.

1. You need **a Client ID** and **a Client Secret**for authentication.

2. To get your **Client ID** and **Client Secret** you should log in to your **Adobe Developer Console**.

3. Create a new project by clicking on the **Create new project**button. If you already have a project, you can use an existing one.

   ![ps-1.png](https://docs.qibb.com/__attachments/a_614659d87df005bc5fac196ad67d1b9fe4ce66e5a7de2316d2f28fda461106f5/ps-1.png?cb=4e9ad5381c558779e15a62b3ee109663)
4. When you click on the button a new project will be created. You have to add **Adobe Photoshop API** to your project by clicking on the **Add to Project** button. You can also edit the name of the project by clicking the **Edit project** button on the right side.

   ![ps-2.png](https://docs.qibb.com/__attachments/a_d869cb7a5d3619b9d5a6094a67eae027fdfa44befd3bb4bd738b1a5eb2e7780e/ps-2.png?cb=43b2e948b9fd06094d1bf977233b1166)
5. Click on the **Add to Project** button and select **Adobe Photoshop API**.

6. ![ps-3.png](https://docs.qibb.com/__attachments/a_fef3e06fc6a58fb421da2bae794f996270cdd685d62c89d074ff3b3fef2acf04/ps-3.png?cb=8010d12142b385c1dd404b38f51a6bb2)

   After clicking the**Adobe Photoshop API** button, the API will be added to your project and you will see your **Client ID** in the page.
7. ![ps-4.png](https://docs.qibb.com/__attachments/a_b75d9ec43a327312368dd06311a3ec24e740dd43d71f5192eae3dd1cbbe456c7/ps-4.png?cb=b3b503ce3e8fb5321b7a633e5500fd04)

   To reach the **Client Secret** , click on **Oauth Server-to-Server** . On the next page click on the**View cURL command** button.
8. ![ps-5.png](https://docs.qibb.com/__attachments/a_94ae59c7af07b328d09563a08bbe077c67ed0117231bb0e68145eb254997a9f1/ps-5.png?cb=5bc8de772390a0827093f51fe535153a)

   You will see your **Client ID** and **Client Secret** in the cURL command.  
   ![ps-6.png](https://docs.qibb.com/__attachments/a_e82bb1e91918fa3101d4f689c374c1e46eba6bd09ed18df87dea677541eae91d/ps-6.png?cb=f7405670bf6dca90c8e85c2fe686e7ac)
9. Copy and store the **Client ID** and **Client Secret** to use later on to authenticate your flow.

10. Go to the qibb **Workflow Editor** , open the **Node Catalog** in the right sidebar, and install the **Adobe Photoshop** node by clicking on the **+** button.

11. Drag the **Adobe Photoshop** **Auth** and **Adobe Photoshop** nodes and any other nodes you require from the left sidebar to your flow and connect them.

12. Open the **Adobe Photoshop** **Auth** node, enter your **Client ID** and **Client Secret** , select an operation in **Adobe Photoshop** node and you can start using the integration!

    ![ps-7.png](/__attachments/a_c49ebc217c846ab0d80c2a6dd1b43169d40de95c8c36b3808c2f0e63388fb7a6/ps-7.png?cb=633175679914ef3d38c3224ef1d5fffc)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Adobe Workfront

## Introduction

Adobe Workfront is a work and project management platform that connects strategy to delivery, integrates people and data across your enterprise and manages work from start to finish so you can deliver measurable outcomes.

Connect, collaborate and simplify workflows using Workfront to launch campaigns and deliver personalized experiences at scale.

You can find more details and the supported operations on [Adobe Workfront \| qibb Catalog](https://www.qibb.com/integrations/adobe-workfront/).

## How to get started with Adobe Workfront integration

Before you get started using **Adobe Workfront** integration please make sure that you have the needed permission for the operations. Here you can find the[Adobe Workfront API Documentation](https://experienceleague.adobe.com/docs/workfront/using/adobe-workfront-api/workfront-api.html?lang=en).

1. To authenticate, you will need a **Host URL** and an **API Key**.

2. Open the **Node Catalog** in the right sidebar of the qibb **Workflow Editor** and install the **Adobe Workfront** nodes by clicking on the "**+**" button.

3. Drag and drop any needed **Adobe Workfront** nodes from the left sidebar into your flow, and connect them.

4. Enter your **Host URL** into the **Host** field, then your **API Key** into the**Advanced/Security**field of the node and start using the integration!

   ![awf-1.png](https://docs.qibb.com/__attachments/a_a9fe993f3654f239d75dba1520086bc1f424a4ceb6650fee7aedb5d6cd35c86d/awf-1.png?cb=b6da9a5f9ab6b5e4a05fb6061751f1f7)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AI Copilot

**Beta Feature**

This feature is currently in BETA and may not be fully functional or stable. We appreciate your feedback as we improve it.

To try AI Copilot, you need:

* App version `v4.0.0` or higher with the AI Copilot feature enabled.

* qibb platform version `v1.43.0` or higher.

* Contact your Support or Customer Solutions representative for setup assistance, as our Support Team will need to set up the Copilot AI backend model.

## **Using the AI Copilot**

The AI Copilot is a chat-based interface located in the right sidebar of your Flow Editor. It helps you build and maintain flows, and once you enter a prompt, it provides rich answers in formats such as text, flow snippets, code snippets, tables, images, and diagrams.  
![qibb_ai_copilot_explain_flow_with_diagram.png](https://docs.qibb.com/__attachments/a_2d3dd4176f52088ad5cb25b01570f29ef745d59444056343182c7df506b4e45f/qibb_ai_copilot_explain_flow_with_diagram.png?cb=8e536c9395929d149b4d0499a7c41d13)
Access the AI Copilot in the right sidebar of the Flow Editor.  
![qibb_ai_copilot_modify_flow.png](https://docs.qibb.com/__attachments/a_9728f800646a786e2725eadfafde207c60023c533edc90ea0a61c8b413e8ecb7/qibb_ai_copilot_modify_flow.png?cb=760824d41ac8d30054805354962596a9)
With a single button click, users can seamlessly import the new or updated flow provided by the AI Copilot.

The AI Copilot is designed to assist you with the following actions:

* **Creating Flows**

  Describe what you need, and the AI Copilot will generate a new flow by selecting the best nodes, writing code for function nodes, and integrating community and qibb nodes to jump-start your project. Import your optimized flow to the Flow App with a single click.

* **Editing Flows**

  Easily update your existing flows using conversational commands. the AI Copilot helps you refine your flows, making them more organized, resilient, and secure. Changes can be applied to the flow directly from buttons integrated into the AI Copilot conversation.

* **Troubleshooting \& Debugging**

  The AI Copilot delivers suggestions which are informed by the contextual data available in the logs and run history.

* **Explaining Flows in Text and Diagrams**

  Receive clear, detailed descriptions and step-by-step breakdowns of your flows to boost understanding and speed up onboarding.

* **Answering Questions \& Helping with Best Practices**

  the AI Copilot provides step-by-step flow solutions and instructions based on qibb's product documentation, helping users enhance flows and deepen their understanding of qibb.

## FAQ

### When will the AI Copilot become available?

qibb's AI Copilot is now live in the demo environment and will be gradually rolled out to all existing customers. The rollout will commence in our SaaS environments and subsequently extend to our dedicated PaaS environments in June and July. Please note that the availability of this feature may vary based on individual account configurations and technical considerations.

### Which Subscription Tier includes this feature?

This feature is available for all subscription tiers at no extra cost, although usage limits will vary depending on your subscription level.

### How reliable are the suggestions provided by the AI Copilot?

Our AI Copilot leverages advanced large language models to generate suggestions designed to help you build and optimize your workflows.

However, there are limitations and it's important to review each response carefully before implementation. Some key points to consider:

* **Context Matters:** The quality of suggestions depends heavily on the clarity and context of your input.

* **Manual Adjustments:** the AI Copilot provides a strong starting point, however additional manual configuration of nodes may be required.

* **Occasional Inaccuracies:** Like any AI system, the AI Copilot may sometimes produce outputs that do not fully match your intent---these are often referred to as "hallucinations."

* **Verification Recommended:** We advise verifying critical details and treating the outputs as a helpful guide rather than definitive answers.

* **Feature Limitations:** Note that certain features and actions may have limitations. Please refer to the comprehensive list of [current feature limitations](https://docs.qibb.com/platform/ai-copilot.md#Current-Limitations).

We are always working to make the AI Copilot better and more accurate, and we'll keep updating it regularly.

### How can I improve the accuracy of the AI Copilot's responses?

To enhance the precision and relevance of the AI Copilot's output, consider the following tips:

* **Be Specific:** Provide clear, detailed, and specific instructions in your prompt. Incorporate relevant context or examples to help the AI Copilot better understand your requirements.

* **Iterative Refinement:** Request minor changes or flow segments step by step, following an iterative approach.

* **Focus the Scope:** Toggle different data sources to help the AI Copilot focus on the most relevant information.

**Tip:**Use Comment Nodes for Copilot Guidance

Insert comment nodes in your flow to add extra documentation for the AI Copilot. For instance, you can include extra system instructions or set a style guide for the AI Copilot on each flow tab. This information will be utilized as long as you share the deployed flow for context.

### Can I bring my own AI Provider Account?

Currently, this feature does not support the use of a custom or third-party AI provider account.

### Which AI model is used?

We currently utilize multiple large language models (LLMs), including those provided by OpenAI, to power the AI Copilot.

### Is my data safe when using the AI Copilot?

the AI Copilot only accesses data that you have explicitly allowed, and sensitive information is never stored or used for training. You remain in full control of your data at all times.

### What data sources is the AI Copilot accessing?

The AI Copilot can access a variety of data sources on-demand, as well as the qibb Knowledge Base. Users have full control over which of their data are available during a session.  
![Screenshot from 2025-06-12 12-44-53.png](https://docs.qibb.com/__attachments/a_52a5100fa030ea2d396f9eb01b96d843b362f0f758ab8cf14ab8618c70ace95f/Screenshot%20from%202025-06-12%2012-44-53.png?cb=c87bc8e25261af3c66122137825539d7)
Options menu with data controls

Data sources include:

* **qibb Knowledge Base**

  * **Nodes**from qibb's Catalog

  * **Flow Templates**from qibb's Catalog

  * qibb's **Public Documentation**

* **Flow Resources**

  * **Flows:** Auto share mode provides the flow selection or current flow tab. Users also have the option to share all flow tabs.

  * **Context Data:** When you share context data keys, the AI Copilot can integrate your defined flow and global context variables in a generated flow. Only the variable names are accessed -- values remain confidential. Include a Secret Manager node in your flow to fully optimize this feature.

* **Platform Monitoring Data**

  * **Logs \& Run History:** Logs and run history related to the flow from the last 30 minutes.

### **What diagram formats can be generated?**

In addition to a Flow Diagram in qibb's familiar flow app format, the AI Copilot can generate visualizations in several formats based on your prompts. This includes diagrams for flow logic and other specific data needs.

Supported formats include (but are not limited to):

* **Sequence Diagram**

* **Flowchart Diagram**

* **Class Diagram**

* **State Diagram**

* **Pie Chart Diagram**

### **Can I restrict access to the AI Copilot for my users?**

Yes, you can control access using a feature toggle available at the app level during deployment or upgrade procedures initiated from the Portal. If the feature is enabled, users with the **Edit** or **View** app roles will have access to the AI Copilot in the Flow Editor.  
![enable-toggle.png](https://docs.qibb.com/__attachments/a_da2511e4e208d5b04b3a8d3c465848b4eee62c7020274a4a7db8aca4bfdd5113/enable-toggle.png?cb=3ef7ec2f718262db08afc2c742c1933a)
Enable the AI Copilot during app deployment or upgrade

## Current Limitations

Some features and actions in the AI Copilot have known limitations. We're working to improve the product and value your feedback. Please review the current limitations below:

**General AI Limitations**

* The accuracy and quality of outputs depend on various factors, and results may vary.

* Always review generated flows and code before implementing them. For additional tips on improving outcomes, please refer to the [AI Copilot FAQ](https://docs.qibb.com/platform/ai-copilot.md#FAQ) on this page.

**No Web Search**

* The AI Copilot currently does not access any external web resources or offer web search functionality. Please include all necessary information directly in the chat.

**Chat History**

* To protect your privacy, chat history is not saved and will be discarded if you clear the conversation, refresh your browser or restart the Flow App.

**Manual Node Installation**

* The AI Copilot does not automatically install missing nodes. You will need to install them manually. Please refer to our documentation for guidance:

  * [Installing nodes from the qibb catalog](https://docs.qibb.com/platform/latest/installing-nodes-from-the-qibb-catalog)

  * [Installing nodes from the Node-RED community](https://docs.qibb.com/platform/latest/installing-nodes-from-the-node-red-community)

**Node Properties Configuration and Data Mapping**

* Some node configurations may not always be considered or applied by the AI Copilot. This can be applicable for error handling, input/output mapping, security fields for API Nodes and Authentication Nodes.

* Occasionally, nodes generated from qibb's catalog may have incorrect operation selections or parameter configurations that do not match the node schema; in such cases, invalid settings are either ignored or appear empty when you open the node properties.

* Occasionally, data mapping between nodes is not implemented correctly, causing generated nodes to reference default variable paths (such as `msg.payload`) even when an alternative variable path is desired. Review variables accordingly to match your desired mapping.

**Working with Flows**

* the AI Copilot may not generate or interpret subflows correctly. We recommend creating flows at a flat level with the AI Copilot and then manually wrapping the logic into subflows afterward.

**Working with JSONata Expressions**

* JSONata expressions generated by the AI Copilot may occasionally contain syntax errors, especially within the body payloads or request parameters of API nodes from qibb's Node Catalog.

**Working with Function Nodes**

* The "Import" syntax for external modules may not be correctly generated within a function node. Please refer to [How to use external modules in a function node](https://docs.qibb.com/platform/latest/how-to-use-external-modules-in-a-function-node) for guidance.

These limitations are part of our ongoing efforts to improve the product. For future updates, check the release notes of [Flow Releases](https://docs.qibb.com/platform/latest/flow-releases) and [Platform Releases](https://docs.qibb.com/platform/latest/platform-releases).

---
language: "en"
---
# Aiconix Live

## Introduction

**aiconix Live** is an innovative AI SaaS platform that provides centralized access to a wide variety of cutting-edge AI solutions. With **aiconix Live**, users can leverage a variety of AI solutions such as face recognition, speech-to-text conversion, and automated subtitle integration to make their video streams more searchable and accessible. This platform supports over 24 languages and stands out for its ease of use, seamless scalability, and ability to expedite the implementation of AI solutions.

You can find more details and the supported operations on [aiconix Live \| qibb Catalog](https://www.qibb.com/integrations/aiconix-live-api/).

## How to get started with aiconix Live integration

Before you get started using the **aiconix Live** integration please make sure that you have the needed permission for the operations. Here you can find the [aiconix Live API Documentation](https://8332303.fs1.hubspotusercontent-na1.net/hubfs/8332303/Dokumentationen/aiconix%20Live_Technical%20Process%20Flow.pdf).

1. You will need your **username** and **password**for authentication, which you will get as part of creating your account with aiconix.

2. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install **aiconix Live** node by clicking on the **+** button.

3. Drag**aiconix Live**nodes and any other nodes you need for your workflow from the left sidebar and place them in your flow.

4. Open an **aiconix Live** node, expand the **Connection** dropdown (first dropdown), and enter your username and password in the connection settings (or configure them once and reuse the configuration for multiple nodes, as shown in the example flow). Then select an operation and start using the integration.

   ![image-20251222-111136.png](https://docs.qibb.com/__attachments/a_6b2f3736b1792495c7c8b11649a37f1a06fe765d0705b1c69c02d9642f80db97/image-20251222-111136.png?cb=ed651bc806868dba7a77012aad3ab842)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Airtable

## Introduction

Airtable is a cloud-based relational database and collaboration platform that combines the simplicity of a spreadsheet with the complexity of a database. It allows users to create, organize, and manage data in a flexible and user-friendly interface, making it suitable for a wide range of tasks, from project management and content planning to inventory tracking and customer relationship management (CRM).

You can find more details and the supported operations on [Airtable \| qibb Catalog.](https://www.qibb.com/catalog/airtable-nodes/)

## How to get started with Airtable integration

Before you get started using Airtableintegration please make sure that you have the needed permission for the operations. Here you can find the [Airtable API Documentation](https://airtable.com/developers/web/api/introduction).

1. You will need a **Personal Access Token** to use as Bearer token for authentication. If you don't have a **PAT**, you need to generate one in your Airtable dashboard.

   1. Login to your Airtable dashboard. Click on your account in the upper right corner of the screen. Here you'll see a dropdown menu appear. Click the **Developer hub** option.

      ![airtable-01.png](/__attachments/a_5a7c5e16c39a7fff5191922400ac76e946ee63748ddcca1716446e4fd3a03f3a/airtable-01.png?cb=0c378f26616614ea1f7f2ddc2dea6157)
   2. This will bring you to the **Personal Access Tokens** page of the hub. From here you'll click the blue Create token option. This will open configuration options for the PAT that you are creating.

      ![airtable-02.png](/__attachments/a_f7173da7b13d036e4387923deedc950cb5c986e754f651dff6c2be8184524df1/airtable-02.png?cb=659fb5b3ad5cd488f85ca15f73c1eee3)
   3. First name the **Personal Access Token** , then choose the scopes you'd like this PAT to have access to. [More information on which scopes are currently offered can be found here](https://airtable.com/developers/web/api/scopes). Finally, choose what level of access this PAT will have. Options include choosing a single base, multiple bases, all of the current and future bases in a workspace you own, or all of the bases from any workspace that you own including bases/workspace added in the future.

      ![airtable-03.png](/__attachments/a_0424f12d786b89e15afef8ef16923ff9ba0322595d06885d0da785e8d732b1dd/airtable-03.png?cb=dc5672921c3f96bf0be0c32cb45bf59b)
   4. Click once again on Create token. Your token will be displayed and can be copied to your clipboard.

   ![airtable-04.png](https://docs.qibb.com/__attachments/a_1f5f97b4fc02e841f4c776c6dc84aab20197e22a06da6e43bbcaa429d27e4a77/airtable-04.png?cb=12d55ecb4f5559ce6f0afaaf9fc5a279)
2. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install **Airtable** nodes by clicking on the **+** button.

3. Drag**Airtable**nodes from the left sidebar and place them in your flow.

4. Open the node, expand the **Connection** dropdown (the first dropdown), and enter your Personal Access Token (prefixed with **Bearer**) in the connection settings. Then start using the integration.

   ![image-20251222-113252.png](https://docs.qibb.com/__attachments/a_0eef20ea8a01680eaaa711375b18d027c82adefb40714a5d64513fb76f2d95c3/image-20251222-113252.png?cb=46db83cb0397221858714097d298a0d4)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

## Using qibb's Secret Manager with Airtable

There are many ways to provide your Personal Access Token in the node's **Connection** configuration (first dropdown). For example, you can use our **Secret Manager** to centrally manage the token and streamline access across all apps within a space.

1. If you haven't already, [get started with our Secret Manager](https://docs.qibb.com/platform/latest/managing-secrets-in-your-space-and-accessing-them-).

2. Add your Airtable Personal Access Token to your space secrets as "AIRTABLE_TOKEN". First click the plus sign at the bottom right of your space secrets list. Then input your key and value. When you've saved your secret, you'll see it in the list.

   ![airtable-secrets1.png](https://docs.qibb.com/__attachments/a_ff61178bf6a9db070a9264230abe55b49dd6c6f00ceee2343e9d58925e65e10b/airtable-secrets1.png?cb=c73896c0fe541f69de046989ba338663)
   Space Secrets  
   ![Screenshot from 2024-01-04 15-06-46.png](https://docs.qibb.com/__attachments/a_f5686b4a7f3942ad0acf5cf002c5911b20e5ebcf7854e7b2ccc33e49589e91ff/Screenshot%20from%202024-01-04%2015-06-46.png?cb=0c628641ff6b8319cca9289986a0c0b4)
   Creating a new Space Secret
3. Navigate to the Flow App you plan to use. Make sure you have installed the **Airtable** and **Secret Manager** nodes from the Node Catalog.

4. Drag the **Secret Manager** node to the grid, configure it to meet your needs and save your flow. When syncing is complete, you'll be able to see that you have a secret called "AIRTABLE_TOKEN" in the global context view.

   1. Note that you do not need and should avoid creating multiple instances of the Secret Manager node in your app. Since the Secret Manager enables access to the space secrets as global context values, they are available in all the flows in this app.

      ![airtable-secrets2.png](/__attachments/a_04a0b04517c2aeb5397a31e70c5cf7b633146b6577c7a09606451009eb08c232/airtable-secrets2.png?cb=fd6aa94d08e49da970c560e1dcc541c6)
      Space Secrets in Global Context
5. Drag an Airtable node (and any other nodes you might need) to the grid; here we have used one of the examples included with your Airtable node. Open an Airtable node, expand the **Connection** dropdown (the first dropdown), and open the connection settings. In the relevant field, open the type dropdown and select **JSONATA expression**.

   ![airtable-secrets3.png](https://docs.qibb.com/__attachments/a_ddf8cf1e937502ef61320e5f0c8d35391ff10030aa41db7a2a47f8f71316ca02/airtable-secrets3.png?cb=309f29c13648259cb309a3b369ab3752)
   Select "JSONATA expression"
6. Enter `"Bearer " & $globalContext("SECRETS.AIRTABLE_TOKEN")` in the apiKey field and click Done.

If the field isn't big enough for you to see what you're typing you can always click the `...` to open the expression editor.  
![image-20240104-143900.png](https://docs.qibb.com/__attachments/a_6ce973d8c5d5623b1da442599ef64b2d4854ad0e5947661648c126fcac509fbd/image-20240104-143900.png?cb=505403dffcdcc8e889e32b727989833d)

7. That's it! You can now run your flow by elegantly accessing this secret.

---
language: "en"
---
# AWS Transcribe

## Introduction

**Amazon Transcribe** is an automatic speech recognition service that uses machine learning models to convert audio to text. With **Amazon Transcribe** , you can customize the language and improve accuracy for your specific use case in various ways, such as using custom vocabularies and language models, content filtering, multi-channel audio analysis, and speaker partitioning.

For more information about Amazon Transcribe and supported operations, please visit [AWS Transcribe \| qibb Catalog](https://www.qibb.com/integrations/aws-transcribe/).

## Getting started with Amazon Transcribe integration

Before you start using **Amazon Transcribe**, make sure you have the necessary permissions and credentials:

1. Ensure you have an AWS account and the appropriate permissions to use **Amazon Transcribe** . You can either create an**IAM user** with the necessary permissions or use an existing **IAM user** with appropriate access keys.

   ![transcribe-1.png](https://docs.qibb.com/__attachments/a_c7fc8c038ead8159bfca34cfc23fbfc3a5b7f6cd2e68524f29a0c1a9d74abe7d/transcribe-1.png?cb=1bc58eae6d071ff88a1928fbb574e2fa)
2. To view the access keys for an IAM user in the console, sign in to the AWS Management Console and navigate to the [++IAM Console++](https://console.aws.amazon.com/iam/).

3. In the navigation panel, choose **Users** , then select the name of the intended user, and click on the **Security credentials** tab. You'll need the**Access key** and **Secret access** key to authenticate with **Amazon Transcribe** .

   ![transcribe-2.png](https://docs.qibb.com/__attachments/a_e61d0b50c41730e8028be2c8fb3d6459f95892adb3b82de61fd065e34678dcbc/transcribe-2.png?cb=582981f206b65d18171e26dd3e277153)
4. If you don't have an **Access key** and **Secret access key** , create a new access key by clicking on the **Create access key** button, selecting **Application running outside AWS** , and then clicking the **Next** button.

5. You can set an optional description tag on the next page then click on the **Create access key** button to continue.

   ![transcribe-4.png](https://docs.qibb.com/__attachments/a_6c3141dfb0d52482bb979a85a5b562aa8f247f474d48ac4fffd725eef3fb84c3/transcribe-4.png?cb=d45dfc7c814f61b91133fc468a76e94c)
6. Copy your **Access key** and **Secret access key** and save them for later use. Please note that you can only reach and copy the **Secret access key** on this page.

   ![transcribe-3.png](https://docs.qibb.com/__attachments/a_b71ebb55809153e70d6e226186b2248a95e50d00a1eb32532d0fc25a82d720bc/transcribe-3.png?cb=8bdfb7fa929545d52a2b5ec0134b7d37)
7. Next, open the qibb **Workflow Editor** and navigate to the **Node Catalog** in the right sidebar. Install the **Amazon Transcribe** node by clicking on the + button.

8. Drag and drop the **Amazon Transcribe** node from the left sidebar to your flow.

9. Enter your account **Region** , **Access key** , and **Secret access key** in the node's **Connection** settings (first dropdown).

   ![image-20251223-110041.png](https://docs.qibb.com/__attachments/a_544bd6d13b1f0965ceb53576645f2871abb000e7c9903dc3cf9eb145b1b743cc/image-20251223-110041.png?cb=81e46701da5f22ad02cce354dbd81038)

10. Besides, an **X-Amz-Target** should be entered as a parameter. After you select an operation, **X-Amz-Target** will be visible on the node.

    ![image-20251223-110144.png](/__attachments/a_776c6776c2c71c97f62a94d7f756be7455c3463e678d748fff0c6e64f3af6b23/image-20251223-110144.png?cb=e55205396f92be3f7cc48974c24ee6a3)

11. After completing these steps, you are ready to start using the integration!

If you're not familiar with AWS or the qibb Workflow Editor, you may need to consult additional resources or seek guidance from a technical expert to ensure that you set up the integration correctly.

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AMPP

## Introduction

Grass Valley's**AMPP** is a SaaS platform designed to enable efficient and flexible media production workflows for live content creation, management, and distribution. The technology is designed to provide broadcasters, content creators, and media companies with a powerful, scalable, and secure platform to create and deliver more content to more channels.

With AMPP, media producers can deploy the best team and technology with custom workflows to suit each project. AMPP scales to any size with reliable and secure access for team members wherever they are.

You can find more details and the supported operations on [AMPP \| qibb Catalog](https://www.qibb.com/integrations/ampp/).

## How to get started with AMPP integration

Before you get started using **AMPP** integration please make sure that you have the needed permission for the operations. Log in to AMPP using your **Host URL** and check out the Documentation Hub for more information.

1. You will need your **Client ID, Client Secret** and **Host URL** for authentication.

   Get your **Client Secret** by creating a new Client in the AMPP Portal. To do so, log into the AMPP portal and navigate to Platform Tools \> Identity Management.
   1. Click the + in the upper right to create a new client.

![Screenshot from 2023-08-29 15-53-41.png](https://docs.qibb.com/__attachments/a_fad636c2deb2b644165dfd23b412ed9ceac403d501c073365faa6b89e14cb4a4/Screenshot%20from%202023-08-29%2015-53-41.png?cb=69e098a452f8eca8c8443e63469e9338)

b. For Grant Type, assign ClientCredentials.  
![Screenshot from 2023-08-29 15-55-42.png](https://docs.qibb.com/__attachments/a_a4424a679f7d79a90d64a071ee2190b6f7a723e857b886c9f0cd50dd55b9f7d0/Screenshot%20from%202023-08-29%2015-55-42.png?cb=68bf9e8d3a17c897dca4b61821f35014)

c. For Allowed Scopes, assign the four that are required for the Orchestration API: platform, platform.readonly, playout.orchestration and playout.orchestration.readonly.  
![Screenshot from 2023-08-29 15-55-52.png](https://docs.qibb.com/__attachments/a_8ad0f82af701a0410df547f31c630ba9354c865f396dae9847b1166eb5517be6/Screenshot%20from%202023-08-29%2015-55-52.png?cb=9a774cebfff5d4f538e03ea0c8acacc9)

d. After clicking "OK" your new ClientID and **API Key** will be displayed. Save your **API Key** in a secure location; it will not be available again through the portal. You will use the API Key as your **Client Secret** in the AMPP Auth Node.  
![ampp1.png](https://docs.qibb.com/__attachments/a_a337e6ab600d4ef4a69769814323b558f18eb3db0d2e9761dec13eb9238e985c/ampp1.png?cb=c4964881d89fa5d171ea5353bd9a07c0)

2. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install the **AMPP** nodes by clicking on the **+** button.

3. Dragthe **AMPP Auth** and **AMPP Orchestration API**nodes from the left sidebar, as well as any other nodes you might need, and arrange them in your flow.

4. Enter your **Client ID, Client Secret** and **Host URL** in the **AMPP Auth Node** and get started using the integration!

   1. The Host URL input for AMPP's **Playout X API** must end in '/orchestration'.

![ampp-docs.png](https://docs.qibb.com/__attachments/a_a5d741ee42256e5e2e2dbde4e0159a07c5b4986d2bfad3b81edb364641a1cf7c/ampp-docs.png?cb=6784b7f6c01df496687949902d339a4c)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# API

premium ULTIMATE

qibb is designed and developed with an API-first approach. All its functionality is exposed via well-defined RESTful API endpoints that are fully described as OpenAPIs.

The RESTful endpoints can be used for request-response based communication to perform typical CRUD operations on resources as well as to send system instructions.

All endpoints share a common API design, including the following key aspects:

* Documentation and machine-readable interfaces based on OpenAPI Specification

* Endpoint-level versioning enables a clear API lifecycle and precise change management, including deprecation and introduction of endpoints.

* OpenID/OAuth 2.0 Token based security and Role-based Access Control on endpoint level

* Common parameters for pagination, filtering, sorting and field masking for efficient data retrieval of resource collections

* [API Policy](https://docs.qibb.com/platform/api-policy-of-qibb-services-and-flows.md)

  qibb's API Policy for Endpoint Deprecation, Retry \& Rate Limiting.
* [API Authentication](https://docs.qibb.com/platform/api-authentication.md)

  Learn about qibb's API authentication and authorization steps.
* [API Reference](https://docs.qibb.com/platform/api-reference.md)

  Learn about qibb's API reference, authentication, and authorization steps.

---
language: "en"
---
# API Authentication

premium ULTIMATE

## API Authentication

Most API endpoints of qibb are private and can only be called by authenticated service accounts or users.  
**Custom platform domains**

The URL examples given on this page use multi-tenant SaaS environments hosted on the qibb.com domain. However, depending on the subscription tier and delivery model (multi-tenant SaaS, single-tenant SaaS, or PaaS), your platform is hosted on a custom domain or subdomain.

Adjust the domain in the URLs given below accordingly to match your environment.  
**Setup of service accounts**

The setup of service accounts requires a custom configuration request via our service desk (Premium or Ultimate subscription required).

As a result, a pair of client credentials (Client ID \& Client Secret) will be shared for authentication (retrieval of tokens).

Authentication is done by issuing a token according to OIDC/Oauth2 standard and using client credentials grant. Therefore, the Identity Provider (IdP) of qibb needs to be called on the following endpoint:
PowerShell

    curl --location 'https://auth.******.qibb.com/auth/realms/qibb/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode 'client_id=******-service-account' \
    --data-urlencode 'client_secret=************' \
    --data-urlencode 'scope=email openid profile roles'

If successful, the response returns a JWT-signed payload, including the **access token** as follows:

    {
        "access_token": "*****",
        "expires_in": ****,
        "refresh_expires_in": ***,
        "token_type": "Bearer",
        "id_token": "*****",
        "not-before-policy": ***,
        "scope": "****"
    }

Use the returned access token in subsequent API calls towards the API endpoint by embedding it in the Authorization header, typically `"Authorization: Bearer <ACCESS_TOKEN>"` (see the API reference for the specific authorization format).

For Example:
Bash

    curl -X 'GET' \
      'https://api.<ENVIRONMENT>.qibb.com/dashboard/v1/tags/dashboards' \
      -H 'accept: application/json' \
      -H 'Authorization: Bearer *********'

**Access Token Expiration**

The Access Token returned by qibb is **temporary** and will expire (typically after just a few minutes, depending on the platform configuration).

* **Expiration Tracking:** Each response includes an `expires_in` field (in seconds). Your application must track this timer.

* **Proactive Re-issuance:** To avoid "401 Unauthorized" errors, your service should proactively request a new token **before** the current one expires.

* **No Refresh Required:** For this Service Account flow, simply repeat the original `client_credentials` call to get a fresh access token. There is no need to use a refresh token for machine-to-machine communication.

## API Authorization

Several endpoints require the service account or user to have permissions granted via [Roles](https://docs.qibb.com/platform/roles), embedded in the issued access token.

* Roles in qibb are fine-grained, defined at the individual API endpoint level.

* Roles for API execution follow a naming pattern closely tied to the API endpoint operation.

* Each API service has it's own OIDC Client, available roles are listed accordingly and can be browsed in the Identity \& Access section of the Portal.

**List of Roles**

For a full list of available roles in your environment, please login to your qibb Portal and navigate to the Roles Page in the Identity \& Access. See [Browsing Roles](https://docs.qibb.com/platform/browsing-roles.md) for more information.  
**Granting Roles to Service Accounts via Groups**

Permissions are not granted to a Service Account directly, but via the group that contains the Service Account. This can be performed by [Assigning roles to a group](https://docs.qibb.com/platform/assigning-roles-to-a-group.md) by a user with suitable Identity \& Access permissions.

Service Accounts, just like Users, can perform different actions on the platform based on their granted permissions, which can be either platform-wide (by granting roles) or resource-based (by granting a membership to a space, app or dashboard).

For example, available roles for the Dashboard API can be discovered with the `qibb-dashboard-api client` filter.  
![Available_API_Roles_Dashboard_API_Example.png](https://docs.qibb.com/__attachments/a_f929f4508f9d66b4439bc669cac406fec3f37bcd11361a811f10aa4572c8b5d8/Available_API_Roles_Dashboard_API_Example.png?cb=e3a1cd3607c7148c1ff446b704aa6995)
Discovering available roles for each API services

Roles for API execution follow a naming pattern closely tied to the API endpoint operation. The role name reflects of the path (e.g. /tags/dashboards) and HTTP operation (e.g., GET, POST, PUT, DELETE) of the API endpoint.

For example, calling `GET /v3/dashboards` of the Dashboard API requires the role `dashboards.get`.

**Examples Endpoints and Roles:**  

|             **Endpoint**              |             **Role**             |
|---------------------------------------|----------------------------------|
| `GET /v2/dashboards`                  | `dashboards.get`                 |
| `POST /v3/dashboards`                 | `dashboards.post`                |
| `PUT /v3/dashboards/{dashboardId}`    | `dashboards._dashboardid.put`    |
| `DELETE /v3/dashboards/{dashboardId}` | `dashboards._dashboardid.delete` |
| `GET /v1/tags/dashboards`             | `tags.dashboards.get`            |

---
language: "en"
---
# API Endpoint Design Assignment

## Introduction

The following assignment would let you build a custom API endpoint that would retrieve **TItanic** CSV data from a URL convert it to JSON and visualize it on request. The API endpoint would be protected by a static API key passed as a header to your request.

### Titanic Columns

| **Column Name** |                 **Description**                 | **Data Type** |                  **Example**                   |
|-----------------|-------------------------------------------------|---------------|------------------------------------------------|
| PassengerId     | ID of the passenger                             | integer       | integer                                        |
| Survived        | Whether the passenger has survived or not       | integer       | 0 = No, 1 = Yes                                |
| Pclass          | Ticket class                                    | integer       | 1 = 1st, 2 = 2nd, 3 = 3rd                      |
| Name            | Name of the passenger                           | string        | Moran, Mr. James                               |
| Sex             | Sex of the passenger                            | string        | female/male                                    |
| Age             | Age in years                                    | integer       | 35                                             |
| SibSp           | Number of siblings / spouses aboard the Titanic | integer       | 2                                              |
| Parch           | Number of parents / children aboard the Titanic | integer       | 1                                              |
| Ticket          | Ticket number                                   | string        | A/5 21171                                      |
| Fare            | Passenger fare                                  | float         | 51.8625                                        |
| Cabin           | Cabin number                                    | string        | C85                                            |
| Embarked        | Port of Embarkation                             | string        | C = Cherbourg, Q = Queenstown, S = Southampton |

Please note that not all records are complete and some are missing data for some of the columns.

## Assignments

The assignment section is divided into two parts:

1. **Simple Assignments** - These require relatively low effort.

2. **Advanced Assignments** - These demand a higher level of effort for completion and are optional.

For each assignment, there is an **Example Output** section that provides an example of how the data should be formatted and returned to the API client requesting it.

### Simple Assignments

GET /api/titanic/passengers (no query params)  
1. Create a `GET /api/titanic/passengers` API endpoint using the **HTTP In** node

2. The call shall be protected by a static API key, passed to the headers as `X-API-Key`. Please use the following UUID (Universal Unique Identifier) `633aca31-b472-465a-a940-a018c0b34838` as a value to the `X-API-Key`

   1. The API endpoint should check if the key is matching and only then proceed with the rest of the data processing

   2. The API endpoint should return HTTP status code 401 (Unauthorized) in case the provided API key is invalid or missing.

3. Retrieve the data from <https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv>. Please note that the provided data is in CSV (comma-separated values) format and you would need to convert it to a JSON format for easier processing.

~You can use the CSV parser node~

4. Rename and conver the column names into camel case:

   1. `PassengerId` -\> `id`

   2. `Survived` → `survived`

   3. `Pclass` -\> `ticketClass`

   4. `Name` → `name`

   5. `Sex` → `sex`

   6. `Age` → `age`

   7. `SibSp` → `siblingsSpouses`

   8. `Parch` → `parentsChildren`

   9. `Ticket` → `ticketNumber`

   10. `Fare` → `fare`

   11. `Cabin` → `cabinNumber`

   12. `Embarked` → `embarked`

5. Convert the values under the `survived` column to a boolean value (0 → `false` and 1 -\> `true`)

6. Convert the values under the `embarked` column to the full name of the port of embarkation (C → Cherbourg, Q → Queenstown, S → Southampton)

7. Create API documentation describing the possible response codes and add a description and a tag of the API endpoint

++**Example Output**++ **:**

`GET /api/titanic/passengers`:
JSON

    [
    {
       "id": 1,
       "survived": false,
       "ticketClass": 3,
       "name": "Braund, Mr. Owen Harris",
       "sex": "male",
       "age": 22,
       "siblingsSpouses": 1,
       "parentsChildren": 0,
       "ticketNumber": "A/5 21171",
       "fare": 7.25,
       "embarked": "Southampton"
    },
    {
       "id": 2,
       "survived": true,
       "ticketClass": 1,
       "name": "Cumings, Mrs. John Bradley (Florence Briggs Thayer)",
       "sex": "female",
       "age": 38,
       "siblingsSpouses": 1,
       "parentsChildren": 0,
       "ticketNumber": "PC 17599",
       "fare": 71.2833,
       "cabin": "C85"
       "embarked": "Southampton"
    }
    ...
    ]

GET /api/titanic/passengers/:id (path param)  
1. Create a `GET /api/titanic/passengers/:id` API endpoint using the **HTTP In** node, where `:id` is a path parameter. Upon providing a valid ID of the passenger, the API endpoint should return **only** the data for that particular passenger.

2. The call shall be protected by a static API key, passed to the headers as `X-API-Key`. Please use the following UUID (Universal Unique Identifier) `633aca31-b472-465a-a940-a018c0b34838` as a value to the `X-API-Key`

   1. The API endpoint should check if the key is matching and only then proceed with the rest of the operation

   2. The API endpoint should return HTTP status code 401 (Unauthorized) in case the provided API key is invalid or missing.

3. Retrieve the data from <https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv>. Please note that the provided data is in CSV (comma-separated values) format and you would need to convert it to a JSON format for easier processing.

~You can use the CSV parser node~

4. Rename and conver the column names into camel case:

   1. `PassengerId` -\> `id`

   2. `Survived` → `survived`

   3. `Pclass` -\> `ticketClass`

   4. `Name` → `name`

   5. `Sex` → `sex`

   6. `Age` → `age`

   7. `SibSp` → `siblingsSpouses`

   8. `Parch` → `parentsChildren`

   9. `Ticket` → `ticketNumber`

   10. `Fare` → `fare`

   11. `Cabin` → `cabinNumber`

   12. `Embarked` → `embarked`

5. Convert the values under the `survived` column to a Boolean value (0 → `false` and 1 -\> `true`)

6. Convert the values under the `embarked` column to the full name of the port of embarkation (C → Cherbourg, Q → Queenstown, S → Southampton)

7. The call shall return HTTP status code 404 in case the provided passenger ID is not found.

8. Create API documentation describing the possible response codes and add a description and a tag of the API endpoint

++**Example Output**++ **:**

`GET /api/titanic/passengers/1`
JSON

    {
       "id": 1,
       "survived": false,
       "ticketClass": 3,
       "name": "Braund, Mr. Owen Harris",
       "sex": "male",
       "age": 22,
       "siblingsSpouses": 1,
       "parentsChildren": 0,
       "ticketNumber": "A/5 21171",
       "fare": 7.25,
       "embarked": "Southampton"
    }

### Advanced Assignments

GET /api/titanic/passengers (introducing queries)  
1. Create a `GET /api/v2/titanic/passengers` API endpoint using the **HTTP In** node. The call must support the following query parameters:

   1. `survived`

   2. `ticket_class`

   3. `sex`

   4. `age`

   5. `embarked`

2. The call shall be protected by a static API key, passed to the headers as `X-API-Key`. Please use the following UUID (Universal Unique Identifier) `633aca31-b472-465a-a940-a018c0b34838` as a value to the `X-API-Key`

   1. The API endpoint should check if the key is matching and only then proceed with the rest of the operation

   2. The API endpoint should return HTTP status code 401 (Unauthorized) in case the provided API key is invalid or missing.

3. Retrieve the data from <https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv>. Please note that the provided data is in CSV (comma-separated values) format and you would need to convert it to a JSON format for easier processing.

~You can use the CSV parser node~

4. Rename and conver the column names into camel case:

   1. `PassengerId` -\> `id`

   2. `Survived` → `survived`

   3. `Pclass` -\> `ticketClass`

   4. `Name` → `name`

   5. `Sex` → `sex`

   6. `Age` → `age`

   7. `SibSp` → `siblingsSpouses`

   8. `Parch` → `parentsChildren`

   9. `Ticket` → `ticketNumber`

   10. `Fare` → `fare`

   11. `Cabin` → `cabinNumber`

   12. `Embarked` → `embarked`

5. Convert the values under the `survived` column to a Boolean value (0 → `false` and 1 -\> `true`)

6. Convert the values under the `embarked` column to the full name of the port of embarkation (C → Cherbourg, Q → Queenstown, S → Southampton)

7. Create API documentation describing the possible response codes and add a description and a tag of the API endpoint

8. The call should only return results if all the query conditions provided in the GET call are met.

9. The query parameters in the URL should be case insensitive, meaning that providing the query as `Survived`, `SURVIVED` and `survived` should all return the same result.

10. The resulting JSON should also return the number of matches by introducing a new parameter called `count: {numberOfMatches}`.

    ++**Example Output**++:

`GET /api/v2/titanic/passengers?survived=false&sex=male&age=30`  
The below provided JSON file should be corrected with an actual count and the first two matching entries!
JSON

    {
       "count":13,
       "data":[
          {
             "id":158,
             "survived":false,
             "ticketClass":3,
             "name":"Corn, Mr. Harry",
             "sex":"male",
             "age":30,
             "siblingsSpouses":0,
             "parentsChildren":0,
             "ticketNumber":"SOTON/OQ 392090",
             "fare":8.05,
             "embarked":"Southampton"
          },
          {
             "id":179,
             "survived":false,
             "ticketClass":2,
             "name":"Hale, Mr. Reginald",
             "sex":"male",
             "age":30,
             "siblingsSpouses":0,
             "parentsChildren":0,
             "ticketNumber":"250653",
             "fare":13,
             "embarked":"Southampton"
          },
          ...
      ]
    }

GET /api/titanic/passengers (introducing queries and pagination)  
* Create a `GET /api/v3/titanic/passengers` API endpoint using the **HTTP In** node. The call must support the following query parameters:

  1. `survived`

  2. `ticket_class`

  3. `sex`

  4. `age`

  5. `embarked`

  6. `sort` - sort the results based on a parameter. This query parameter can accept the following values:

     1. `age` - sort the results by age

     2. `name` - sort the results by name

     3. `fare` - sort the results by fare

  7. `sort_order` - the order for the sorting. This query parameter should accept the following values:

     1. `asc` - ascending order (smallest to largest), e.g. 0 → 9, A → Z

     2. `desc` - descending order (largest to smallest), e.g. 9 → 0, Z → A

  8. `page` (needed for the pagination)

  9. `per_page` (needed for the pagination)

* The call shall be protected by a static API key, passed to the headers as `X-API-Key`. Please use the following UUID (Universal Unique Identifier) `633aca31-b472-465a-a940-a018c0b34838` as a value to the `X-API-Key`

  1. The API endpoint should check if the key is matching and only then proceed with the rest of the operation

  2. The API endpoint should return HTTP status code 401 (Unauthorized) in case the provided API key is invalid or missing.

* Retrieve the data from <https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv>. Please note that the provided data is in CSV (comma-separated values) format and you would need to convert it to a JSON format for easier processing.

* Rename and conver the column names into camel case:

  1. `PassengerId` -\> `id`

  2. `Survived` → `survived`

  3. `Pclass` -\> `ticketClass`

  4. `Name` → `name`

  5. `Sex` → `sex`

  6. `Age` → `age`

  7. `SibSp` → `siblingsSpouses`

  8. `Parch` → `parentsChildren`

  9. `Ticket` → `ticketNumber`

  10. `Fare` → `fare`

  11. `Cabin` → `cabinNumber`

  12. `Embarked` → `embarked`

* Convert the values under the `survived` column to a Boolean value (0 → `false` and 1 -\> `true`)

* Convert the values under the `embarked` column to the full name of the port of embarkation (C → Cherbourg, Q → Queenstown, S → Southampton)

* Create API documentation describing the possible response codes and add a description and a tag of the API endpoint

* The call should only return results if all the query conditions provided in the GET call are met.

* The query parameters in the URL should be case insensitive, meaning that providing the query as `Survived`, `SURVIVED` and `survived` should all return the same result.

* The pagination should introduce two new query parameters:

  * `page` - the number of the page

  * `per_page` - how many results per page should be returned. The maximum value of the `per_page` parameter should be limited to 100.

* The resulting JSON should also return the number of matches by introducing a couple of new parameters:

  * `count` - the number of matches on the current page

  * `total` - total number of matches across all the pages

  * `firstPage` - the URL of the first page

  * `previousPage` - the URL of the previous page

  * `currentPage` - the URL of the current page

  * `nextPage` - the URL of the following page

  * `lastPage` - the URL of the last page

++**Example Output**++ **:**

`GET /api/titanic/v3/passengers?survived=false&page=4&per_page=50`  
In the example payload below, the `nextPage` value is `null` as the requested page is the final page, hence the fact that both `currentPage` and `lastPage` share the same value.
JSON

    {
       "count":50,
       "total":549,
       "firstPage":"/api/v3/titanic/passengers?page=1&per_page=50",
       "previousPage":"/api/v3/titanic/passengers?page=3&per_page=50"
       "currentPage":"/api/v3/titanic/passengers?page=4&per_page=50",
       "nextPage":"/api/v3/titanic/passengers?page=5&per_page=50",
       "lastPage":"/api/v3/titanic/passengers?page=11&per_page=50",
       "data":[
          {
             "id":737,
             "survived":false,
             "ticketClass":3,
             "name":"Ford, Mrs. Edward (Margaret Ann Watson)",
             "sex":"female",
             "age":48,
             "siblingsSpouses":1,
             "parentsChildren":3,
             "ticketNumber":"W./C. 6608",
             "fare":34.375,
             "embarked":"Southampton"
          },
          {
             "id":453,
             "survived":false,
             "ticketClass":1,
             "name":"Foreman, Mr. Benjamin Laventall",
             "sex":"male",
             "age":30,
             "siblingsSpouses":0,
             "parentsChildren":0,
             "ticketNumber":"113051",
             "fare":27.75,
             "cabinNumber":"C111",
             "embarked":"Cherbourg"
          },
          ...
      ]
    }

---
language: "en"
---
# API Endpoints Design

## Introduction

In this tutorial, we'll guide you through the creation of a simple mockup reference API using the built-in tools in the qibb flow editor. This API is designed to allow you to:

1. Retrieve a list of all customers

2. Access information about an individual customer through their unique ID

3. Create a new customer entry

4. Update existing customer data

5. Remove an existing customer record from the system

## Tutorial Flow Source Code

To follow this tutorial, you can import the attached flow below. Simply download the attached JSON file below and import it into your flow app.

[api_design_flow.json](https://docs.qibb.com/__attachments/a_0b51af572c0f06bee853f5a6c43dbd2a4f438a050f682fcaa34bbfa350433f30/api_design_flow.json.md?cb=57231beaad86b2c027d7f4f7fd0ad0dd)

You can do this by either pressing `Ctrl + I` simultaneously or by navigating to the main settings and selecting the `Import` option.

## Tutorial

With qibb, you can effortlessly create polished Open API reference files and share them with your partners or customers. Simply start by adding an **HTTP In** node, connect it to a few change/function nodes, followed by an **HTTP Response** node, and then fill out the relevant documentation to add the corresponding description of the endpoints and the possible parameters/body.

This example API contains the following calls:

* `GET /customers` - to retrieve information for all the customers saved in the CUSTOMERS global variable.

* `GET /customers/:id` - to fetch information about a specific customer based on its unique ID.

* `POST /customers` - to create a new customer's object.

* `PATCH /customers/:id` - to update an existing customer's data based on its ID.

* `DELETE /customers/:id` - to delete an existing customer from the global context.

### API Documentation

API documentation plays a crucial role in giving your API endpoints a professional and well-documented appearance. You can generate the documentation directly within the corresponding **HTTP In** node by editing the "*Docs*" section. Within this section, you'll find several tabs:

* **Info**: Offering general information about the endpoint.

* **Parameters**: Where you can specify the query, body, or path parameters supported by your call.

* **Responses**: For configuring the supported HTTP status codes and the format body of the output from your endpoints.

![2024-02-05_17-20.png](https://docs.qibb.com/__attachments/a_af79bb8a90ad7bc6b578fbe08a304ec0ea48d3e7f76dce72f7a9229849297f08/2024-02-05_17-20.png?cb=511ec0898bacf31eaf73b33016087d31)
Adding Parameters Documentation

#### Info Tab

Here you can specify:

* **Summary**: A concise description, displayed alongside your API call, even when the endpoint is collapsed.

* **Description**: Offers a more detailed explanation of your call, accessible only when you expand the endpoint.

* **Tags**: Defines the tag for this API call, helping organize calls into categories.

* **Consumes**: Comma-separated list of input Mime Types supported by your endpoint.

* **Produces** : Specifies the format of your responses, e.g. `application/json`.

* **Security**: Allows you to set the required authentication mechanism for this endpoint.

* **Deprecated:**a checkbox that marks this particular call as deprecated.

![2024-02-05_17-21.png](https://docs.qibb.com/__attachments/a_13f225d924f7b155191ebe3dfacf49e5f2cdbb452e042a8eb19de2e317c0f8b2/2024-02-05_17-21.png?cb=bd8e50ddb7b43403aa97fbe611bd3fb0)
Info Tab

#### Parameters

You can add here the supported parameters, by pressing the **+parameter**button and define:

* **Name**: Name of the parameter

* **Parameter's type**: possible types:

  * query

  * header

  * formData

  * body

* **Description**: Description of the parameter

* **Type** : Choose between *string* , *number* , *integer* , *boolean* , and *array*

* **Format** : In OpenAPI, the `format` field typically provides additional information about the data type specified in the `type` field. For example:

  * formats for `"type": "string"` can be:

    * date

    * date-time

    * email

    * uuid

    * etc.

  * formats for `"type": "number"` can be:

    * float

    * double

    * int32

    * int64

    * etc.

* **Required**: a checkbox that defines whether the parameter is required or not. The default value is not required.

**Path Parameters**

By default, the qibb flow editor automatically includes every path parameter defined in the URL within this tab, and marks them as mandatory.

For instance, in the case of a GET request to `/customers/:id`, the `id` parameter would be automatically included in this section. However, you still need to define the **Description** , **Type** , and **Format**.  
![2024-02-05_17-23.png](https://docs.qibb.com/__attachments/a_b7b394df11afd2b01e4d5b7baa5865fef677cda39bd2d20fe02126ecc4254de3/2024-02-05_17-23.png?cb=04cfe3d36dfee2265155d8037cf3a023)
Definition of Payload Body

### Responses

The third tab, called Responses allows you to specify the potential HTTP status codes and the response format for your API call.

Here, you can describe the HTTP status code and define the properties returned from your call.

A comprehensive list of all HTTP Status codes can be found at <https://developer.mozilla.org/en-US/docs/Web/HTTP/Status>  
![2024-02-05_17-26.png](https://docs.qibb.com/__attachments/a_ac6d63952c44a7dabc12718aa7a4f71383292851f2b56af3fd6b2d56097ecfe0/2024-02-05_17-26.png?cb=c50a1264a38fcddb03ca0657fcc631b5)
Definition of HTTP Responses

### API Reference

You can access the API reference documentation that you have created from the API Reference tab as shown in the screenshot below:  
![2024-02-05_17-44.png](https://docs.qibb.com/__attachments/a_985218d7d40ce16b6be1bceb0d41aa8f2b471ebb397f93fa771361224a74cfc5/2024-02-05_17-44.png?cb=90d4cb589d2c424ddc888f5183faa55a)
API Reference Tab

From here you can also access the automatically generated URL of your OpenAPI reference in a JSON format, which you can use to load in a swagger editor or provide to a third-party partner.

### Customers' Data Storage in the Global Context

**Customers Storage**

When creating API endpoints, it's common to store the associated data securely for easy access later on. Typically, this involves using a database. However, in this tutorial, we'll keep things simple by using the global context instead.  
**Initializing the Data**

I'm configuring the **CUSTOMERS** and **USER_CREDENTIALS** global variables within the change node labeled "*Initialize Customers Global Variable*". Remember to activate the inject node before proceeding any further.

The API calls write and read the customers' data directly from the global variable called `CUSTOMERS`, which is saved in the global context of your flow application. When you initialize the context, it will create that variable with an empty array.  
![2023-11-06_23-45.png](https://docs.qibb.com/__attachments/a_62e3f87ea0de20e52cc2c69bb09c8011ee528b6f71c0712331f5c3fd3251073d/2023-11-06_23-45.png?cb=6bdb59d6e90eb28e67f8e68234c9fbb9)
Global Context and Customers' Initial Data

### API Authentication

**API Authentication**

It's important to note that the `POST`, `PATCH`, and `DELETE` calls require basic authentication, ensuring secure interactions, while the `GET` calls are accessible without any sort of authentication.

For authentication, we've chosen basic authentication, requiring both the username and password. The "Initialize Customers Global Variable" action sets the **USER_CREDENTIALS** global variable to a JSON object containing the username in plain text and a salted hash of the actual password.

In the flow, I've decided to employ [bcryptjs](https://www.npmjs.com/package/bcryptjs), leveraging the blowfish cipher to produce a salted hash of the original password, as demonstrated by the following line of code:
JavaScript

    const hashedPassword = await bcrypt.hash(decodedPassword, saltRounds);

The `bcrypt` hash algorithm is a cryptographic hashing function specifically designed for securely hashing passwords. It is based on the [Blowfish](https://en.wikipedia.org/wiki/Blowfish_(cipher)) cipher and incorporates a unique salt for each password hash. Salting prevents attackers from using precomputed tables (like rainbow tables) to crack passwords, even if multiple users have the same password.

I am using the `bcrypt` compare function to compare both the plain text password, provided in the API call, and the salted password, stored in the **USER_CREDENTIALS** global variable:
JavaScript

    const passwordMatch = await bcrypt.compare(decodedPassword, saltedPass);

The constant variable `passwordMatch` would return **True** when both the salted hash saved in the **USER_CREDENTIALS** matches the plain text password provided with the API call and **False** otherwise.

You can read more about the hashing and salting implementation of `bcrypt` here: <https://auth0.com/blog/hashing-in-action-understanding-bcrypt/>.

### API Endpoints

**API Reference Documentation**

Please note that all HTTP In nodes are having thoroughly documented **Info** , **Parameters** , and **Responses** that is visible from the **API Reference Tab**.

Get a List of All Customers  
The first API endpoint is fetching information about all customers (`GET /customers`). Here we simply have the **HTTP In** node connected to a change node, that sets the `msg.payload` to the content of the **CUSTOMERS** global variable and finishes with an HTTP response node.
Get a Specific Customer by Their ID  
This call uses a **Function** node to filter customers and provide data only for the one with a matching ID provided in the URL path parameter `:id`.  
**Message Routing**

Notice here that we have two outputs of the **Function** node, each connected to a separate **HTTP Response** node. This is not required, but it is considered a good practice, as this will give your flow to further extend its functionality and connect it with some extra nodes, in terms of an error.

We are also using the `setErrorResponse()` function to set the description of the error and the status code in our response.
Create a Customer  
When we're creating new objects, we typically use **POST** calls.

Since this call involves handling customer data, we need authentication to ensure that only authorized users can create customers. This authentication process occurs in the "*Check Basic Authentication* " function node, using the [bcryptjs](https://www.npmjs.com/package/bcryptjs) external npm module.

By default, the username and password are provided in the **Authorization** header, encoded in **base64** , and separated by a colon. To proceed, we first fetch the value of this header and decode it using **base64**, extracting both the username and password like this:
JavaScript

    // Extract the base64-encoded credentials part (after "Basic ")
    const base64Credentials = credentials.split(' ')[1];

    // Decode the base64-encoded credentials
    const decodedCredentials = Buffer.from(base64Credentials, 'base64').toString('binary');

    // Extract username and password from decoded credentials
    const [decodedUsername, decodedPassword] = decodedCredentials.split(':');

Next, we split the `decodedCredentials` string by the colon sign and compare the plain text password provided in the header with the salted password hash saved in the **USER_CREDENTIALS** global variable using:
JavaScript

    const passwordMatch = await bcrypt.compare(decodedPassword, saltedPass);

If the provided username and password match, we proceed to the next node, which validates the provided customer data.

If the **Authorization** header is not set or if the username and password don't match we return a 401 (*Unauthorized* ) status code, if there is a problem with the comparison function we return 500 (*Internal Server Error* ) and in both cases, the **msg** object is routed through the second output and connected to an**HTTP Response**node.

In the "*Customer's Data Validation* " **function** node, we enforce the minimum required properties for creating a customer object. These properties are the bare minimum required to create a new customer. To facilitate this validation, we utilize a map called `validTypeMap`, which outlines the valid properties and their respective types. If the incoming request body lacks any mandatory properties or contains unsupported properties or types, we return HTTP status code 400 and a JSON containing a description of the error while redirecting the message object to the second output.

The final step, executed within the "*Create Customer* " **function** node, involves the generation of a Universally Unique Identifier (UUID) using the [uuid](https://www.npmjs.com/package/uuid) npm module. This UUID, conforming to version 4 standards, serves as a unique identifier for the customer object, ensuring each customer has a unique ID. Upon generation, this UUID is appended to the customer object which is then pushed to the `CUSTOMERS` global variable.  
![2023-11-06_23-58.png](https://docs.qibb.com/__attachments/a_a8a12b1104a0f91c382eab4183aa24414bc1fc10ae6251a81e22327670349a0e/2023-11-06_23-58.png?cb=52cb10262e7f6759a5523ebc273adfc1)
Example of customers' data with two objects Update Existing Customer  
The `PATCH /customers/:id` endpoint allows the modification of a specific customer identified by its unique ID (UUID). This call changes the properties provided in the request body while leaving untouched those not explicitly included.

Again we have a function node, that checks if the username and password passed along with the call are valid, and validates the data from the call, similar to the `POST /customers` call.  
**Data Validation**

Unlike the customer creation process, no mandatory properties are defined here because the customer object already exists.

Similarly to previous calls, any discrepancies or errors in the modification data trigger an HTTP status code 400 (*Bad Request*) along with a descriptive error message in the response payload.

Within the "*Customer's Data and ID Validation* " function node, we verify the existence of the specified customer ID. If the ID is not found, a 404 (*Not Found*) status code is returned alongside an appropriate error description.

The final **function** node, "*Update Existing Customer* " executes the actual update process. Here, the new properties extracted from the request body are assigned to the existing customer (referred to as `matchingCustomer`), effectively applying the requested modifications using:
JavaScript

    // Re-assigns the values from the payload to the matchingCustomer object
    Object.assign(matchingCustomer, customer);

    // Overwriting the data for the matching customer
    customers[customers.findIndex(obj => obj.id === customerId)] = matchingCustomer;

    // Pushing the updated customers list to the global variable CUSTOMERS
    global.set("CUSTOMERS", customers);

and we push the updated customers array back to the global `CUSTOMERS` variable and return the modified customer object to the caller.
Delete an Existing Customer  
The final call in our mockup API involves deleting a customer through the `DELETE /customers/:id` endpoint. Similar to previous operations, this call employs the same function node to validate the provided credentials.

This time we only check if the provided customer ID in the URL path of the call exists as the **DELETE** call doesn't have any payload.

Upon confirmation of the customer's existence, the corresponding entry is removed from the `CUSTOMERS` global variable. This removal is accomplished by utilizing the customer's index within the array. The array is then updated by splicing out the element at that index and reassigning the modified array to the global context.
JavaScript

     // Fetching all customers data
    const customers = global.get("CUSTOMERS");

    // Saving the path parameter ID from the GET call
    const customerId = msg.req.params.id;

    // Attempting to find a customer with the specified ID
    const customerIndex = customers.findIndex(customer => customer.id === customerId);

    // Delete the object with the matching ID
    const updatedCustomers = customers.splice(customerIndex, 1);

    // Update the global 'customers' variable
    global.set('customers', updatedCustomers);

After completing the deletion process, we set the HTTP status code to 204 (*No Content*). This status code indicates to the caller that the requested action has been successfully executed, and no content is being returned in the response body. It serves as a confirmation that the customer deletion operation has been completed without any issues.

## Testing the API

In the second logical group, I've developed several flows to accomplish the following tasks:

1. Retrieve information for all customers.

2. Retrieve information for a specific customer based on its unique ID.

3. Execute a flow that involves creating a customer object, modifying it, and then deleting the customer.

Throughout the testing process, I exclusively utilized the qibb OpenAPI node.

To access this node, you must install it from the qibb Node Catalog.

Instructions for installation can be found 👉 <https://docs.qibb.com/platform/latest/using-the-qibb-node-catalog-plugin>. For further details about the OpenAPI client node, refer to <https://docs.qibb.com/platform/latest/openapi-client>. To integrate your API reference, follow the steps outlined in <https://docs.qibb.com/platform/latest/how-to-expose-your-flow-as-an-openapi>.

Once the OpenAPI node is installed, proceed by adding the connection to your OpenAPI reference JSON file, and ensure to configure the Hostname accordingly as shown on the screenshot below:  
![2024-02-07_16-47.png](https://docs.qibb.com/__attachments/a_6f36168d673765fdb7e059bade372b86381136b251fcee90d0b644133fc6c5db/2024-02-07_16-47.png?cb=d3a35c814731480baeea62f57f6d3fc5)
Adding OpenAPI JSON Reference \& Hostname

Once you do this, you will have all available API endpoints available there under **Operations**.  
![2024-02-07_16-54.png](https://docs.qibb.com/__attachments/a_7f511f5727eade9ed61622640e691655a04c081a8b174a9baf5df6356de6f7b8/2024-02-07_16-54.png?cb=f99fcdd9e1dc403cc5b7553f2c624862)
Available Operations

### Basic Authentication

The `GET /customers` and `GET /customers/:id` endpoints do not require any credentials for access. However, the **POST** , **PATCH** , and **DELETE** calls do require authentication. To execute these operations, you must provide credentials either through the **Advanced** section of the nodes or by passing them directly before the corresponding OpenAPI node:
JSON

    msg.parameters.credentials.BasicAuth = {
      "username": "admin",
      "password": "J8Px(n23E%Sa<.l6)J2Ms6"
    }

![2024-02-07_16-55.png](https://docs.qibb.com/__attachments/a_1f19cff713ac05829c8fa1cd4d912035b22a710c135b5d90bf486aaa82c8ee56/2024-02-07_16-55.png?cb=1ff684f7d48b1c82ec258f1a20a5aca4)
Setting Credentials from within the OpenAPI node

### Test Flows

Retrieve a List of All Customers  
This flow is straightforward, comprising just three components: an **inject** node, an **OpenAPI** node configured with the `GET /customers` operation, and a **debug** node.
Fetch Information About a Specific Customer  
This flow closely resembles the previous one, albeit with the additional requirement of providing the `customerId` to the **OpenAPI** node. To achieve this, I've opted to transmit it via `msg.customerId`, a parameter set within the **inject** node.  
![2024-02-07_17-12.png](https://docs.qibb.com/__attachments/a_f32748b1e64554a376df34ac4537d445d83f7f16cd94799d53822ba648291f78/2024-02-07_17-12.png?cb=c06475c498671c302c586eaf65387dfc)
Setting Customer ID Create, Update \& Delete Customers  
To automate the creation, modification, and deletion of customers, I've employed three distinct **OpenAPI** nodes, each configured with its corresponding operation (**POST** , **PATCH** , and **DELETE**).  
**Template Nodes**

For facilitating customer creation, I've integrated two **inject** nodes, each accompanied by a **template** node defining a separate customer object and assigning it to `msg.parameters.body` outside the **OpenAPI** node. Alternatively, you can achieve the same by defining the customer object directly in the body field within the **OpenAPI** node.

The "*Save Customer ID and Call Preparation* " **change** node is responsible for storing the generated customer's ID while simultaneously removing the *payload* and *headers*.

Subsequently, the next **OpenAPI** node is configured for `PATCH /customers/:id`, with the modification properties set directly in the node's body. This node selectively modifies the specified properties of the object while leaving the remainder untouched.

Following this, a **change** node is utilized to delete several message properties, before the flow proceeds to the final **OpenAPI** node. Here, we execute the deletion of the previously created customer.

Upon successful execution, we expect to receive a status code of 204 from the last debug node, signaling the successful completion of all operations.

---
language: "en"
---
# API Policy

premium ULTIMATE

## Endpoint Deprecation

Our versioning at the endpoint level ensures a clear API lifecycle and effective change management, allowing for fine-grained deprecation of old endpoints and the introduction of new ones.

* The version is indicated with a "vX" segment in the URL path, for Example: `/v1/`.

* Deprecated endpoints will be removed no earlier than `3` releases after their deprecation, providing consumers sufficient time to react and adapt to the changes.

## Retry Policy

To ensure reliable communication, qibb's API Gateway has built-in retry handling for incoming HTTPS API requests for all qibb services and your flows. When the gateway detects a failed request, such as a timeout, server error or downtime, it catches the response and resends the request multiple times.

If any retry attempt succeeds, the gateway forwards the successful response to the client.  

|     **Component**     | **Per try timeout** The timeout for each retry | **Number of retries** The number of retries to execute for a failed request. |          **Retry on** When to retry a failed request.           |
| **qibb API services** |                  `15 seconds`                  |                                     `3`                                      | * Status code `5XX` * Or service does not respond at all (down) |
|       **Flows**       |                  `15 seconds`                  |                                     `10`                                     | * Status code `5XX` * Or service does not respond at all (down) |
|-----------------------|------------------------------------------------|------------------------------------------------------------------------------|-----------------------------------------------------------------|

## Rate Limit Policy

Any API endpoint provided by qibb is safeguarded with rate limiting measures to enhance the availability and resilience of your services. If you exceed the rate limit for a particular service, you will receive a response containing Status code `429`.  

|                       |           **Rate Limit**           |
| **qibb API services** | 500 requests per IP per minute.\*  |
|       **Flows**       | 500 requests per IP per minute.\*  |
|      **Global**       | 1100 requests per IP per minute.\* |
|-----------------------|------------------------------------|

ULTIMATE

\*For Ultimate PaaS or SaaS deployments, rate limit rules can be configured or disabled upon request to meet customer needs. Please contact our Support team.

---
language: "en"
---
# API Reference

premium ULTIMATE

## Exploring qibb's API References

The qibb platform consists of multiple backend API services. Each service provides an API reference accessible via the built-in API Explorer (Swagger UI). Visit the URLs in the table below to access the API directly from your browser. Each API service is accessible under the following URL pattern: `https://api.<ENVIRONMENT>.qibb.com/<API-SERVICE>/`

![Bildschirmfoto 2026-02-26 um 14.52.18.png](https://docs.qibb.com/__attachments/a_99f83fe3908e1b2acd7137918ff38d9b51376f00af7b3c3d8af24aa7815f7d8c/Bildschirmfoto%202026-02-26%20um%2014.52.18.png?cb=2b6767d3674634a2db24ee944d287bda)
Each API service of qibb can be directly explored in the Browser with the built-in API Explorer (Swagger UI).

**Custom platform domains**

The URL examples given on this page use multi-tenant SaaS environments hosted on the qibb.com domain. However, depending on the subscription tier and delivery model (multi-tenant SaaS, single-tenant SaaS, or PaaS), your platform is hosted on a custom domain or subdomain.

Adjust the domain in the URLs given below accordingly to match your environment.

## API References

|       **Service**       |                                    **Description**                                    |                                            **API Explorer URL**                                             |      **OIDC Client**      |
|-------------------------|---------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|---------------------------|
| **Portal API**          | Backend platform service for managing apps and spaces.                                | `https://api.<ENVIRONMENT>.qibb.com/portal-api/swagger`                                                     | `qibb-portal-api`         |
| **Secret Manager API**  | Backend platform service for managing space secrets.                                  | `https://api.<ENVIRONMENT>.qibb.com/secret-manager/swagger/index.html`                                      | `qibb-secret-manager-api` |
| **Dashboard API**       | Backend platform service for managing custom dashboards.                              | `https://api.<ENVIRONMENT>.qibb.com/dashboard/swagger`                                                      | `qibb-dashboard-api`      |
| **Flow Management API** | Backend platform service for reading and managing low-code flow and job-related data. | `https://api.<ENVIRONMENT>.qibb.com/flow/swagger/index.html`                                                | `qibb-flow-api`           |
| **IAM/IM API**          | Backend platform services for managing users, groups and roles.                       | `https://api.<ENVIRONMENT>.qibb.com/iam/swagger` `https://api.<ENVIRONMENT>.qibb.com/im/swagger/index.html` | `qibb-iam-api`            |
| **Cluster API**         | Backend platform service for managing registered clusters.                            | `https://api.<ENVIRONMENT>.qibb.com/cluster/swagger`                                                        | `qibb-cluster-api`        |
| **Deployment API**      | Backend platform service for specifically adding, upgrading or deleting apps.         | `https://api.<ENVIRONMENT>.qibb.com/deployment/swagger`                                                     | `qibb-deployment-api`     |
| **App Catalog API**     | Backend platform service for storing app deployment templates.                        | `https://api.<ENVIRONMENT>.qibb.com/catalog/swagger`                                                        | `qibb-catalog-api`        |
| **Log API**             | Backend platform service for searching and browsing app log history.                  | `https://api.<ENVIRONMENT>.qibb.com/log/swagger/index.html`                                                 | `qibb-log-api`            |
| **Run API**             | Backend platform service for searching and browsing app run history.                  | `https://api.<ENVIRONMENT>.qibb.com/flow-run/swagger/index.html`                                            | `qibb-flow-run-api`       |
| **Copilot API**         | Backend platform service for conversational AI assistant.                             | `https://api.<ENVIRONMENT>.qibb.com/copilot/swagger/index.html`                                             |                           |

**Deprecated Endpoints \& Deactivated API features**

Note that API references may include deprecated or recently removed endpoints, which are labelled accordingly, see [API Policy](https://docs.qibb.com/platform/api-policy-of-qibb-services-and-flows.md). If multiple versions of the same endpoint exist, it is highly recommended to use the latest version. Additionally, some features or API endpoints may be inaccessible or deactivated depending on your environment subscription or security configuration.

---
language: "en"
---
# Apps

## Related articles

* [Editing details of an App](https://docs.qibb.com/platform/editing-details-of-an-app.md)

  Learn how to edit the details of the app.
* [Browsing Apps](https://docs.qibb.com/platform/browsing-apps.md)

  Learn about how to browse apps.
* [Managing App Links](https://docs.qibb.com/platform/managing-app-links.md)

  Learn how to use and manage App Links

---
language: "en"
---
# Architecture

qibb is available as **SaaS** on qibb-hosted infrastructure, with both multi-tenant and single-tenant options, or as **PaaS** deployed within the customer's own infrastructure.

The qibb platform is designed as a fully cloud-native platform running on top of Kubernetes, the industry standard for container orchestration.

qibb is based on a microservice architecture, which is characterized by lightweight, container-based services. All services of the platform are optimized for the deployment on a distributed infrastructure and efficient use of system resources with the help of container virtualization. For example, a high resource utilization can be achieved by densely placing several containers on a node and thus minimizing idle processes. The platform and its workload can be rolled out and operated across several clusters, which in turn consist of several distributed nodes.  
![saas.png](https://docs.qibb.com/__attachments/a_3602797cabaa57feda67c3999c637e834c11558ce33b470eb723e23c7a418db2/saas.png?cb=369c3f6e19445a9e14c79e50b05b1e0d)
qibb has a reliable, enterprise-ready SaaS infrastructure

## Multi-cluster architecture

ULTIMATE

The qibb platform can run and manage its workload across multiple clusters, which can be set up on different sites, locations or infrastructure environments. This allows site-specific requirements to be implemented.  
**What is a cluster?**

A cluster is a group of distributed nodes. It combines their computing power, memory \& storage to one entity.

For public cloud, we support the deployment on top of managed Kubernetes Services on AWS EKS. For on-premises, we support the deployment of qibb into Kubernetes environments running on VMware vSphere, such as provisioned and managed by Rancher RKE.  
![clusters.png](https://docs.qibb.com/__attachments/a_b623c3e37c3f9cb72117e3ddf38d5db8a02907a20fc5723266d399dd8842bd8a/clusters.png?cb=bc62573e5ec47f67b76692b28822c6ad)
qibb clusters can be deployed on leading cloud providers or within your own on-premises infrastructure.

For example, it is possible to implement the placement of services (e.g., qibb flows) at specific locations to meet availability, latency or regional compliance requirements. With qibb, the following typical location-based multi-cluster scenarios can be mapped:

* Hybrid cloud by combining on-premise data centers and public cloud.

* Multi-cloud by combining multiple public clouds.

* Multi-region by combining several regions of a public cloud.

* Multi-site by combining several on-premise data centers.

At the same time, a high degree of isolation can be achieved by operating multiple clusters:

* Separation of clients based on dedicated clusters.

* Separation of responsibilities within the organization.

* Separation of infrastructure-based environments with independent lifecycles.

* Limiting the failure radius to improve the reliability of services.

* Security isolation of services according to their trustworthiness or sensitivity of data.

[Learn more about app deployments via qibb](https://docs.qibb.com/platform/deploying-an-app-1.md)

**Multi-cluster communication**

Network connectivity must be ensured with suitable firewall rules to allow ingress and egress traffic between qibb clusters as well as for any communication between qibb workflows and connected third-party services.

The qibb platform distinguishes between different cluster types, which are based on their purpose and the services they contain. In addition, the respective clusters may have different features depending on their use case, such as different instance types or number of nodes.  

|                                                                                                                                                                                                                   **Main Cluster**                                                                                                                                                                                                                    |                                                                                                                                                                                                                          **App Cluster**                                                                                                                                                                                                                          |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| The Main Cluster of qibb represents the control plane of the platform. This cluster hosts the core components of qibb, which are responsible for the central management of all identities, deployed flows and connected clusters. Depending on the active user base and the number of attached clusters, the main cluster may require more or less resources to manage them. The cluster can be dynamically resized on-demand depending on the usage. | The App Cluster is designed for running workloads (e.g., qibb flows). It serves as a base area for the creation of spaces and the rollout of application flows. For this purpose, it has an independent gateway to process network data streams independently of the Main Cluster. In addition, this cluster type hosts independent services for monitoring, which collect logs and metrics from local workload and forward them to external monitoring services. |

[Learn more about qibb clusters](https://docs.qibb.com/platform/clusters.md)

### Resilience

Each microservice is responsible for a specific application domain or task and has minimal dependencies on other services, providing fault containment through isolated and independent components.

Critical services can be rolled out redundantly. Different rollout methods are supported:

* Distributed rollout across multiple nodes, which ensures continued operation in the event of a node failure.

* Distributed rollout across multiple zones in the public cloud or multiple data centers on-premise, which ensures continued operation in the event of a zone failure.

* Optimized rollout of databases with sharding and replication.

Failure of partial components (containers) as well as complete nodes is automatically detected and compensated by the container orchestrator. Recovery can take place within a very short time and is fully automated. Typically, a failed container can be restored within seconds, a failed node within minutes.

### Architecture details

* [Connect qibb with your services within private networks](https://docs.qibb.com/platform/connect-qibb-with-your-services-within-private-net.md)
* [Network Agent](https://docs.qibb.com/platform/network-agent.md)

---
language: "en"
---
# Asana

## Introduction

Asana is a web-based application that helps teams and individuals manage projects and tasks. With Asana, users can create projects, assign tasks, set deadlines, and track progress. It also allows for team communication and file sharing.

Asana offers customizable workflows and integrations with other tools such as calendars, email, and file-sharing platforms, making it a versatile solution for team collaboration and productivity. With Asana, teams can stay organized and on track to achieve their goals.

You can find more details and the supported operation on [Asana \| qibb Catalog.](https://www.qibb.com/catalog/asana-nodes/)

## How to get started with Asana integration

Before you get started using **Asana** integration, you need to create a Personal Access Token (PAT). You can visit [Personal access token](https://developers.asana.com/docs/personal-access-token) page to get more information.

1. To generate a **Personal Access Token** you can visit [Asana developer console](https://app.asana.com/0/my-apps) after logging in to Asana.

2. Click on the **Create new token**button.

   ![asana-1.png](https://docs.qibb.com/__attachments/a_34ffdbae24215a40286ba524375c8237be9daf32fb24089a9e066829afe48f72/asana-1.png?cb=28e65e30df47ee1f0796907f76971b9e)
3. Give a name to the token and click on the **Create token** button.

4. After creating the token, copy it and store it in a safe place so that you can use it later in the flow.

   ![asana-3.png](https://docs.qibb.com/__attachments/a_1af663cff368a006d8e0f3331e04c23e74dcf2dfb73a8d5cbb0466090765ddaf/asana-3.png?cb=6f454e4eaf798f47bb03a587492b5e1d)
5. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install **Asana** node by clicking on the + button.

6. Drag the **Asana** node from the left sidebar and place it in your flow.

7. Enter your token in the node's **Connection** settings (first dropdown). After completing this step, you are ready to build new flows. Depending on the selected operation, you may need to provide additional information such as a project ID, workspace ID, etc.

   ![image-20251222-130843.png](https://docs.qibb.com/__attachments/a_cfd8be8f3fc3231f6ee94eacf7102a5c0848d2214d63b47e7fea4594e992f756/image-20251222-130843.png?cb=28b1e5ab8e79f450a1504ac07a26c9b7)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Aspera Faspex

## Introduction

IBM Aspera Faspex is a centralized transfer solution that enables users to exchange files with each other using an email-like workflow. Faspex enables high-speed transfers using IBM Aspera's proprietary FASP protocol, fully utilizing available network bandwidth to maximize speed while preserving control and security. User-uploaded files and folders are sent to, stored on, and downloaded from Aspera transfer servers.

You can find more details and the supported operations at [Aspera Faspex \| qibb Catalog](https://www.qibb.com/integrations/aspera-faspex/)**.**

## How to get started with Aspera Faspex integration

Before you get started with **Aspera Faspex** integration, please make sure that you have the needed permissions for those operations.

1. Get a **Client ID** associated with your account in the Aspera Faspex UI. You can get it or create a new one under Configurations \> API clients.

2. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install **Aspera Faspex** node by clicking on the **+** button.

3. Drag the **Aspera Faspex**auth node to the grid and configure the required inputs.

   1. **Server URL:** The **Aspera Faspex** Server instance URL where it is running.

   2. **Client ID:** It can be generated from the Aspera Faspex UI under Configurations \> API clients.

   3. **Private Key (RSA):** Application users should have their user-specific key entered into their account under Account settings \> Preferences \> Public key.

      In order to generate an RSA Key pair, please follow [these instructions](https://www.ibm.com/docs/en/aspera-faspex/5.0.5?topic=aa-configuring-oauth-2-non-user-based-workflows-jwt) and then add the public key to the desired account.

   4. **User Email:** This is the Aspera Faspex email account which is associated with the Private RSA key added in the previous step.

   5. **App Redirect URL:** The URL to redirect the user(s) after successful authentication.

   6. **Expiration Time:** Optional expiration time for the access token generated after being authenticated successfully. 2h by default.

4. Drag the **Aspera Faspex**API node and any other nodes that you require from the left sidebar to your flow and connect them. Now you can start using the integration!

   ![image-20230804-072821.png](https://docs.qibb.com/__attachments/a_19a74cd208d3da8b0fb63f646bc4547be774b077fd6b4e8a44c9045ce5eb8557/image-20230804-072821.png?cb=7466c864b9feb622f3c8f4d354e173ab)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Aspera on Cloud

## Introduction

IBM **Aspera on Cloud** is a cloud-based data transfer service that enables high-speed, secure, and reliable transfer of large files and data sets over the internet. It uses advanced encryption and data compression techniques to transfer data quickly and securely, regardless of the distance or network conditions.

**Aspera on Cloud** is designed for businesses of all sizes and industries, including media and entertainment, healthcare, and government.

IBM **Aspera on Cloud** provides a web-based interface and RESTful APIs that enable easy integration with other cloud-based applications and services. It also offers advanced features such as bandwidth control, file verification, and automatic retry to ensure efficient and secure transfer of large files and data sets.

You can find more details and the supported operations on [Aspera on Cloud \| qibb Catalog.](https://www.qibb.com/integrations/aspera-on-cloud/)

## How to get started with Aspera on Cloud integration

Before you get started with the **Aspera on Cloud** integration, please make sure that you have the needed permissions for those operations. Here you can find [Aspera on Cloud API Documentation](https://developer.ibm.com/apis/catalog/aspera--aspera-on-cloud-api/Introduction).

1. You need **an Email address** which is used to sign in to Aspera on Cloud**, Organization ID, API Client ID, Client Secret, a Private key and a Public key**for authentication.

2. You can find your**Organization ID** in the URL of your Aspera on Cloud dashboard (e.g. **orgname1234**.ibmaspera.com).

   ![aoc-1.png](https://docs.qibb.com/__attachments/a_f47d78ae1d02a59c457f8f14d6cde558bfb53de92d947e906f0803ee8397cec7/aoc-1.png?cb=4dbdb333033488f1a59da34012b688b5)
3. To generate an **API Client Id** and **Client Secret** click on the **App Switcher** button in the top right corner and then click on the **Admin**button.

   ![aoc-2.png](https://docs.qibb.com/__attachments/a_43b9b81fa7e7157bfc8e0a1055efe302ed636a65e05c677d75e9d19c1ee9ac5c/aoc-2.png?cb=3464042a3463b6be522ebf310abe0231)
4. On the **Admin** page, click on the **Integrations** , **API clients** and**Create new** buttons to create a new **API client**.

   ![aoc-5.png](https://docs.qibb.com/__attachments/a_e9deb74c04ca638c373cdf5485d04aee95924e109bfe93b11fc7b276aca2437a/aoc-5.png?cb=0227cd9cc5e080af005666443a25c6ad)
5. Give a name to your **API client** . Type "**blank** " as a **redirect URI** and save it. Then enable**JWT grant type** and click on the **Create**button.

   ![aoc-3.png](https://docs.qibb.com/__attachments/a_ebe7e3f104ce563171e08d0a06861db1c94fdfba3d0996f32357e0e04bd7aa53/aoc-3.png?cb=2b1ddcc0733ece5e7c6370d8107bbe6d)
6. Once you click on the **Create** button, your **API Client ID** and **Client secret** will be generated.

   ![aoc-4.png](https://docs.qibb.com/__attachments/a_040d265e15a0d1b0131240c7c054aa2c2ccb0d4db4add0697ec1b6a96e5f6a8d/aoc-4.png?cb=b2c543af37b3ec91b8029ad6fe89ceb6)
7. For authenticating**Aspera on Cloud,** you need to generate a **Private key** and a **Public key** locally. You could use **openssl** to generate **Private-Public key** pairs. Here you can find information about how to generate **Private and Public keys** : [Configuring for Aspera on Cloud](https://www.ibm.com/docs/en/aci/3.9.2?topic=i-configuring-aspera-cloud-1).

8. Once you have generated **Private and Public keys** , you need to enter your**Public key** in the relevant field in your account settings. Go to the**Account Settings** by clicking the **User** button in the top right corner.

   ![aoc-6.png](https://docs.qibb.com/__attachments/a_c38aaaa73984ce2fc472b08b707a63a7b427cf9bbb20be4fa45889d458ef5adf/aoc-6.png?cb=0e2e277c0fb4f803745151170746f0bb)
9. Scroll down the page, enter your**Public key** in the relevant field and click on the **Save**button.

   ![aoc-7.png](https://docs.qibb.com/__attachments/a_4f115887ba0049260b2e9a2714b12d93de60cb86e76070dc3c19eab92cfe07cd/aoc-7.png?cb=fc8c6a0ae5c2787c2b6fb4a6524a3418)
10. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install **Aspera on Cloud** node by clicking on the **+** button.

11. Drag**Aspera on Cloud API** and **Aspera on Cloud Auth**node from the left sidebar and place them in your flow.

12. Open the **Aspera on Cloud Auth** node, enter your **Email address, Organization name, API Client ID, Client Secret** and**Private key,** select an operation inthe **Aspera on Cloud**node and start using the integration!

    ![aoc-8.png](/__attachments/a_f5249454913e81e002c982c598c8cc798b390a1f791f69accaa3ff1248351f20/aoc-8.png?cb=020078ea488ac122dc55170e894e1245)

## Get started with Aspera Node API integration

If you want to use **Aspera Node API** node, make sure that you have a valid **Access Key** and a **Secret Key**.

1. Aspera sends the **Access Key** and **Secret** as a **txt** file into **Packages**.

   ![2024-04-24 17_11_05-All files - IBM Aspera on Cloud.png](https://docs.qibb.com/__attachments/a_6c21e615c5406ad8cf31e9542d1c0c09fe41e54f57d0fe09ef9dee7fd4a185e3/2024-04-24%2017_11_05-All%20files%20-%20IBM%20Aspera%20on%20Cloud.png?cb=fd8d3a903c2ffa794d359f3e50f6b9c7)
2. Redirect to the **Packages** page and download the **txt** file. You will find the **Access Key** and **Secret**in this file.

   ![2024-04-24 17_13_34-My inbox - IBM Aspera on Cloud.png](https://docs.qibb.com/__attachments/a_c45cea76a52621945cc4820548aa89e9724ee9472391f01a453009273cd90be3/2024-04-24%2017_13_34-My%20inbox%20-%20IBM%20Aspera%20on%20Cloud.png?cb=08e69ff263e1086c5da956460f7ceb31)
3. Drag**Aspera Node API**nodes from the left sidebar and place them in your flow.

4. Enter your **Access Key** as the **Username** and your **Secret Key** as the **Password** in the node's **Connection** settings (first dropdown). You are now ready to start using the integration.

   ![image-20251222-131355.png](https://docs.qibb.com/__attachments/a_9169a4518b4038b2b1790ebc1d5eb4e41ac92d5d26323794fa90dd21140a7604/image-20251222-131355.png?cb=a1cfc0c62109a06c6ac1186fdb074ebe)

For the **Aspera Node API** integration, you do not need to use the authentication node. The Aspera Node API uses **Basic Authentication** , so it is sufficient to enter your **Access Key** and **Secret Key** in the node's **Connection** settings (first dropdown).

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Assigning a Client Role to a User or a Group

To manage access to a deployed app, follow these steps:

1. Navigate to the app overview page for the app you want to manage.

2. Select the **Access** tab.

3. Choose the **Manage Members** button for the role you want to assign.

![deployed_app_manage_access.png](https://docs.qibb.com/__attachments/a_391374dd8d49d37ec3080653aa799f7125cb7482c833b09d9d7a9969beddd729/deployed_app_manage_access.png?cb=9076350b08e306f5d261ea52fbd1564f)
Manage Access for an App

4. Select the **+** button to assign the role to a user or group.  
![deployed_app_manage_access_add_user_group.png](https://docs.qibb.com/__attachments/a_41e1621dabdbab781493f7c88886011f8154f8fe4edf9f29f0a7ba8e8a6297a9/deployed_app_manage_access_add_user_group.png?cb=d4fdf8757a8548cd696d8ca2fd3be182)
Add a User or a Group to a Role

5. Choose a user or group from the dropdown and confirm your choice.  
![deployed_app_manage_access_add_user_group_final.png](https://docs.qibb.com/__attachments/a_9f4b9a9a82fd0a684a139999272f65990c6b26b64bc99ec5d8ea6b7794afc908/deployed_app_manage_access_add_user_group_final.png?cb=5129e87a6759a282e4654eaa1b5c757b)
Add the selected User or a Group to a Role

6. Close the Manage Members window.

By following these steps, you can manage access to your deployed app and ensure that only authorized users have access.

---
language: "en"
---
# Assigning roles to a group

ULTIMATE

Assigning roles to a group requires the following steps:

1. Navigate to the **Groups** page.

2. Select the group name to which a role should be assigned.

3. Choose the **Role Mappings** tab from the top bar.

   ![image-20220105-135310.png](https://docs.qibb.com/__attachments/a_a472566d872b333be29d5bf2410642d1af1018275914e00b204b698a53b505ca/image-20220105-135310.png?cb=6938746917f07a2a33b33b9c18ca907b)
   Assigning roles to a group - Remove and add a role by using the assigned toggle button
4. Select the assigned toggle button under the assigned column to **remove** and **add** a role to the group.

To know how to navigate and browse through group role mappings follow:

[Browsing group role mappings](https://docs.qibb.com/platform/browsing-group-role-mappings.md) .

---
language: "en"
---
# Assigning roles to a user

ULTIMATE

Assigning roles to a user requires the following steps:

1. Navigate to the **Users** page.

2. Select the name initial icon of the user that has to be assigned to the role.

3. Choose the **Role Mappings** tab from the top bar.

   ![image-20220105-133340.png](https://docs.qibb.com/__attachments/a_cda35a9af7dc09456b65c42f452bcbb275e63e98470913fec7a95f9924172062/image-20220105-133340.png?cb=5374705ea17b5350f6a440c723b7dd79)
   Assigning roles to a user - Remove and add a role by using the assigned toggle button   
4. Select the assigned toggle button under the assigned column to **remove** and **add** a role to the user.

To know how to navigate and browse through user role mappings follow:

[Browsing user role mappings](https://docs.qibb.com/platform/browsing-user-role-mappings.md) .

---
language: "en"
---
# Assignments

## Introduction

This section outlines the tasks you are expected to complete as part of this tutorial series. Assignments are designed to help you apply the knowledge and skills you have acquired in a practical context.

These hands-on exercises are essential for reinforcing your understanding and achieving the desired learning outcomes. Be sure to carefully read and follow the guidelines and requirements for each assignment, and feel free to seek assistance or clarification if needed. Your engagement in the assignments will contribute to a comprehensive understanding of the subject matter and your overall success in the course or training program.  
* [Basic Nodes Assignment](https://docs.qibb.com/platform/basic-nodes-assignment.md)

  Create your first qibb flow using the basic inject, switch, change, template, and function nodes.
* [Cat as a Service (CaaS)](https://docs.qibb.com/platform/cat-as-a-service-caas.md)

  The assignment demonstrates how to use the HTTP request node and qibb OpenAPI nodes to request random cat images from the CaaS (Cat as a Service) API.
* [API Endpoint Design Assignment](https://docs.qibb.com/platform/api-endpoint-design-assignment.md)

  Retrieve and analyze Titanic data through API endpoints.

---
language: "en"
---
# Ateme Plus

## Introduction

**Ateme Plus** is a SaaS solution that delivers high-quality video experiences built with Ateme's technology. It integrates seamlessly into existing workflows and ecosystems with **Ateme Plus** APIs, offering infrastructure management and reliable security managed by a team of dedicated experts. With **Ateme Plus** technology, you can achieve the best video quality at the lowest bitrates, keeping your audience captivated today and into the future.

For more details and information on supported operations, visit [Ateme Plus \| qibb Catalog](https://www.qibb.com/integrations/ateme-plus/).

## How to get started with Ateme Plus integration

Before getting started with **Ateme Plus** integration, ensure that you have the necessary permissions for the operations.

1. To authenticate, you will need a **Base URL, Username,** and **Password**.

2. Open the **Node Catalog** in the right sidebar of the qibb **Workflow Editor** and install the **Ateme Plus** node by clicking on the "+" button.

3. Drag and drop the **Ateme** **Plus** node from the left sidebar into your flow, and connect them.

4. Enter your credentials into the **Base URL** , **Username** , and **Password** fields of the authentication section in the **Ateme Plus** node and start using the integration!

![image-20260317-225813.png](https://docs.qibb.com/__attachments/a_8dc281e56f82de315b50a7eb28b72f6eabdcba78f01bcf6be1b89bccf9b1f5d3/image-20260317-225813.png?cb=5337e16207e0916579aa2396bc00411a)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Ateme Titan Live

## Introduction

**Ateme Titan Live** is a powerful, software-based compression solution designed for delivering high-quality SD, HD, and Ultra HD content over cable, DTH, and OTT networks. It can run on any host and is optimized for Linux, Virtual Machines, and Micro-Services. **Ateme Titan Live** uses the ATEME 5th Generation STREAM compression engine, delivering the highest video quality at the lowest possible bitrates with accelerated parallel processing. Whether you're delivering content to main screens or multiscreen applications, from small resolutions up to UHDp60, **Ateme Titan Live** can meet your current and future requirements.

To learn more about TITAN Live's capabilities, check out the details and supported operations on [Ateme Titan Live \| qibb Catalog](https://www.qibb.com/integrations/ateme-titan-live/).

## Getting Started with Ateme Titan Live Integration

Before you begin using **Ateme Titan Live** integration, make sure you have the necessary permissions for the operations you want to perform.

Follow these steps to get started:

1. Obtain your **Username, Password,** and **Host address** for authentication.

2. Open the qibb **Workflow Editor** and navigate to the right sidebar to open the **Node Catalog**.

3. Install the **Ateme Titan Live** node by clicking on the "+" button.

4. Drag the **Ateme Titan Live** nodes from the left sidebar to your flow and connect them.

5. Enter your **Ateme Titan Live** credentials in the node's **Connection** settings (first dropdown) by filling in the **Username** and **Password** fields, then enter your **Base URL** in the **Host** field of the **Ateme Titan Live** node. Alternatively, you can configure global secrets and reference the credentials via [qibb's Secrets Manager](https://docs.qibb.com/platform/latest/managing-secrets-in-your-space-and-accessing-them-). See the Ateme Titan Live example flow and its setup instructions for more information. Select an operation in one of the API call nodes to start using the integration.

   ![image-20251222-131952.png](https://docs.qibb.com/__attachments/a_c8b4d685df66c1862aadd5281e2e2279a56595d26b5ec0d8c87a14b45e9245d0/image-20251222-131952.png?cb=b37a2115db3b0206ee174bfeae4ccf59)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Avid MediaCentral Cloud UX

## Introduction

**Avid MediaCentral Cloud UX** node is an integration of the MediaCentral \| UX. It is a collaborative and customizable media workflow and management platform that offers extensive capabilities that accelerate production. MediaCentral provides a unified media production platform, with AI capabilities, that enables collaboration from any location, accelerating content turnaround. MediaCentral streamlines the entire production workflow, enabling dispersed teams to create better content faster, deliver to more outlets and devices, and maximize the value of your media.

Avid MediaCentral Cloud UX Node leverages the Media Services API (CTMS), a family of REST APIs adhering to common conventions. These APIs provide seamless access to a variety of backend systems, including Interplay Production, Media Central \| Asset Management, and Media Central \| Newsroom Management. This integration ensures efficient and standardized communication with these essential components of the MediaCentral ecosystem.

You can find more details and the supported operations at [Avid MediaCentral Cloud UX \| qibb Catalog](https://www.qibb.com/integrations/avid-mediacentral-cloud-ux/)**.**

## How to get started with Avid MediaCentral Cloud UX integration

Before getting started with **Avid MediaCentral Cloud UX** integration, ensure that you have the necessary permissions for the operations.

1. To authenticate, you will need a **URL, Client ID, Client Secret, Username,** and **Password**.

2. Open the **Node Catalog** in the right sidebar of the qibb **Workflow Editor** and install the **Avid MediaCentral Cloud UX** node by clicking on the "+" button.

3. Drag and drop the **Avid MediaCentral Cloud UX** node from the left sidebar into your flow, and connect it.

4. Open the **Avid MediaCentral Cloud UX** node, expand the **Connection** dropdown (the first dropdown), and enter your credentials in the **URL** , **Client ID** , **Client Secret** , **Username** , and **Password** fields in the connection settings. Then select an operation and start using the integration.

   ![image-20260108-102144.png](https://docs.qibb.com/__attachments/a_bad4a9b8455404e9e674cacf40e4798e8fb2651ae187de0f18e66008e5150092/image-20260108-102144.png?cb=397d95ffbf21cda840ce7d306daf32b7)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Avid MediaCentral Production

## Introduction

**Avid MediaCentral Production** is a media production platform that centralizes content management and fosters real-time collaboration among teams. With **MediaCentral Production**, users can manage and access their media assets from a unified interface, making it easier to find and utilize relevant content. It provides robust project management tools, enabling teams to efficiently plan, execute, and monitor their productions.

**Avid MediaCentral Production** supports a wide range of media formats and workflows, making it adaptable for various production requirements, whether it's video, audio, or graphics. Furthermore, it offers integration with other industry-standard software and hardware solutions, ensuring compatibility with existing systems.

**Avid MediaCentral Production** is a WS-I Basic Profile compliant document/literal SOAP web service. This means that it adheres to the Web Services Interoperability (WS-I) Basic Profile standards, specifically utilizing the document/literal style for SOAP (Simple Object Access Protocol). Unlike REST, SOAP does not rely on URLs and HTTP methods. In SOAP, all information is encapsulated within the request body, typically formatted in XML. SOAP emphasizes a strict contract and relies on a predefined description language (WSDL - Web Services Description Language) to outline the structure of messages and operations. This compliance ensures a standardized and interoperable communication protocol, facilitating seamless integration with other systems and applications. In essence, it enables Avid MediaCentral Production to communicate effectively with a diverse range of technologies and platforms, promoting consistency and reliability in data exchange within the broader ecosystem.

You can find more details and the supported operations at [Avid MediaCentral Production \| qibb Catalog](https://www.qibb.com/integrations/avid-mediacentral-production/)**.**

## How to get started with Avid MediaCentral Production integration

Before you get started using the **Avid MediaCentral Production**integration please make sure that you have the needed permission for the operations.

1. You will need your **username** and **password**for authentication.

2. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install **Avid MediaCentral Production** node by clicking on the **+** button.

3. Drag**Avid MediaCentral Production**nodes and any other nodes you need for your workflow from the left sidebar and place them in your flow.

4. To be able to send an endpoint request, the request body must be configured correctly. Double click on the node and edit **Body** which is under the **Parameters**section.

   ![image-20251222-132812.png](https://docs.qibb.com/__attachments/a_d92827367a0eac35a60e9d7e37dee8382d905f3f46fcffc0c8594201d47220e2/image-20251222-132812.png?cb=02ae5ed8690ce9a65c91092e813f17c0)

5. Click on **Reset to default values** button to switch request body to xml format.

   ![2023-12-05_14-07-00.png](https://docs.qibb.com/__attachments/a_2107d9256446c87a9c606e8c4288841bca31ce6ca5392cbab85db8fa48f8c91f/2023-12-05_14-07-00.png?cb=1554cccb4d79c05f92ed74b9202c1a35)
6. Enter your **username** and **password** into the**UserCredentials** field and **InterplayURI** of request body and start using the integration!

   ![image-20231205-060740.png](https://docs.qibb.com/__attachments/a_2d14692d1ec8f9355eced10eef1ae919f761b99619ad7b0108880aafa24677d1/image-20231205-060740.png?cb=5fcfb493794d8e2144ee17e0e0abf7a0)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AWS Cost Explorer

## Introduction

**AWS Cost Explorer** is a powerful tool that allows you to analyze and understand your costs and usage in the cloud. You can explore your usage and costs using the main graph, the Cost Explorer cost and usage reports, or the Cost Explorer RI reports. With Cost Explorer, you can view data for up to the last 12 months, forecast how much you're likely to spend for the next 12 months, and get recommendations for what Reserved Instances to purchase. This can help you identify areas that need further inquiry and see trends that you can use to understand your costs better.

You can find more details and the supported operation on [AWS Cost Explorer \| qibb Catalog](https://www.qibb.com/integrations/aws-cost-explorer/).

## How to get started with AWS Cost Explorer integration

Before you get started using **AWS Cost Explorer** integration, please make sure that you have the necessary permissions for the operations you want to perform.

To get started, follow these steps:

1. Obtain your **Access key, Secret access key,** and **Region** information for your AWS account.

2. If you need to list the access keys for an IAM user, sign in to the AWS Management Console and open the [IAM console](https://console.aws.amazon.com/iam/). In the navigation pane, choose **Users** , the name of the intended user, and then choose the **Security credentials** tab.

   ![transcribe-1.png](https://docs.qibb.com/__attachments/a_63fd5baed5aff699bbfdcae7d58eacb5e9afaef340694d46717cd455a903b7ab/transcribe-1.png?cb=1bc58eae6d071ff88a1928fbb574e2fa)
3. If you don't have an **Access key** and **Secret access key** , you need to create a new access key. To create new keys, click on the **Create access key** button, select **Application running outside AWS** , and click on the **Next** button.

4. You can set an optional description tag on the next page. Click on the **Create access key** button to continue.

5. Copy your **Access key** and **Secret access key** and save them for use later in the flow. Please note that you can only access and copy the **Secret access key** on this page.

   ![transcribe-3.png](https://docs.qibb.com/__attachments/a_c074ba50e26d7b4001092da217031648d6db96f5769308942b9c3d2b0326facd/transcribe-3.png?cb=8bdfb7fa929545d52a2b5ec0134b7d37)

6. In the qibb **Workflow Editor** , open **Node Catalog** in the right sidebar and install the **AWS Cost Explorer** node by clicking on the + button.

7. Drag and drop the **AWS Cost Explorer** node from the left sidebar to your workflow.

8. Enter your **Region** , **Access key** , and **Secret access key** in the node's **Connection** settings (first dropdown).

   ![image-20251222-133848.png](https://docs.qibb.com/__attachments/a_9cdc6e63a8351a00e0f3c9108a5eed914b1707be21f1bc824c91caa03d2558f9/image-20251222-133848.png?cb=abefef04d52480a2cc619ea585eb47f3)

9. Besides, an **X-Amz-Target** should be entered as a parameter. After you select an operation, **X-Amz-Target** will be visible on the node.

   ![image-20251222-133633.png](https://docs.qibb.com/__attachments/a_0d5e1976647399dca5cfbb5fffd7219bfa7b327879e697447c4ceaf0887805b7/image-20251222-133633.png?cb=ef7ce87d1e0fc1c859f3eb07dcce8e87)

10. After completing these steps, you are ready to start using the integration!

If you're not familiar with AWS or the qibb Workflow Editor, you may need to consult additional resources or seek guidance from a technical expert to ensure that you set up the integration correctly.

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AWS Elemental MediaConnect

## Introduction

**AWS Elemental MediaConnect** is a service that makes it easy for broadcasters and other premium video providers to reliably ingest live video into the AWS Cloud and distribute it to multiple destinations inside or outside the AWS Cloud. MediaConnect provides the reliability, security, and visibility that you are used to with existing distribution methods, combined with the flexibility and cost-effectiveness that internet-based transmission provides.

For ingest, you send content to **AWS Elemental MediaConnect** from an on-premises contribution encoder, which encodes your video into a single, high-quality mezzanine file for contribution into the cloud. After the video is in the AWS Cloud, MediaConnect sends it to outputs that you specify, such as a cloud encoder, another MediaConnect flow, or an on-premises destination.

With **AWS Elemental MediaConnect**, you can do the following:

* Ingest live video into the AWS Cloud.

* Distribute live video to multiple destinations inside or outside the AWS Cloud.

* Subscribe to a live video stream that is supplied by another AWS account. (This requires permission from the content originator through an entitlement.)

* Send content from one AWS Region to another.

You can find more details and the supported operation on [AWS Elemental MediaConnect \| qibb Catalog](https://www.qibb.com/catalog/aws-elemental-mediaconnect-nodes/).

## How to get started with AWS Elemental MediaConnect integration

Before integrating **AWS Elemental MediaConnect** into your application, make sure that you have the necessary permissions to perform the required operations.

To get started, you will need your **Access key** , **Secret access key** , and **Region** information for authentication. If you do not already have an **Access key** and **Secret access key**, you can create them by following these steps:

1. Sign in to the **AWS Management Console** and open the [IAM console](https://console.aws.amazon.com/iam/).

2. In the navigation pane, choose **Users** , select the name of the intended user, and then choose the **Security credentials** tab.

   ![transcribe-1.png](https://docs.qibb.com/__attachments/a_2899697e5676b9a3d361c89160a2908186c05a7d5606af3aa45448b8c322f93c/transcribe-1.png?cb=1bc58eae6d071ff88a1928fbb574e2fa)

3. Click the **Create access key** button, select **Application** running outside AWS, and then click **Next**.

4. (Optional) Set a description tag, and then click **Create access key** to continue.

5. Copy your **Access key** and **Secret access key** and save them for later use.

![transcribe-3.png](https://docs.qibb.com/__attachments/a_93645fb353bdd1dd6d2a08945745a68bfcb0235eb48f82fb27eb9e332085b461/transcribe-3.png?cb=8bdfb7fa929545d52a2b5ec0134b7d37)

In addition to the **Access key** and **Secret access key** , you have to assign to the newly created user proper access to the **AWS Elemental MediaConnect** functionality. To give full access to the MediaConnect functionality, you need to create a new policy, following these steps:

1. In the navigation pane, choose **Users** , and select the name of the intended user. As part of the new view, make sure you are on the **Permissions** tab, click on the **Add permissions** dropdown, and choose **Create inline policy**.

   ![image-20230727-080225.png](https://docs.qibb.com/__attachments/a_59234431d321b6368553751ad6bd4725923aec0817836aeecb23fb246f486c16/image-20230727-080225.png?cb=35a822030174f9366a69366908a6c3e6)
2. Define your permission by creating a new policy. For that choose the JSON view and use the following policy, granting full access to the **AWS Elemental MediaConnect** functionality, as well as limited IAM write access, limited CloudWatch read access, and limited EC2 list access. To add more or fewer rights to the policy you can always edit based on your needs.

   JSON

       {
           "Version": "2012-10-17",
           "Statement": [
               {
                   "Action": [
                       "mediaconnect:*"
                   ],
                   "Effect": "Allow",
                   "Resource": "*"
               },
               {
                   "Action": [
                       "ec2:DescribeAvailabilityZones"
                   ],
                   "Effect": "Allow",
                   "Resource": "*"
               },
                {
                   "Action": [
                       "cloudwatch:GetMetricData"
                   ],
                   "Effect": "Allow",
                   "Resource": "*"
               },
               {
                   "Action": [
                       "iam:PassRole"
                   ],
                   "Effect": "Allow",
                  "Resource": "*",
                   "Condition": {
                       "StringLike": {
                           "iam:PassedToService": "mediaconnect.amazonaws.com"
                       }
                   }
               }
           ]
       }  

   ![image-20230727-081431.png](https://docs.qibb.com/__attachments/a_3f4abc438d6cf112262338a3c52c86e79b6afe5aecf60f89abac5f0811577522/image-20230727-081431.png?cb=68dfa8319fb2446d290fe8961db05f0b)
3. On the **Review policy** page for **Name** , enter **MediaConnectAllAccess** , and then choose **Create policy** . You can find all defined permissions for the policy as a part of the provided table **Permissions defined in this policy**.

Once you have your **Access key** and **Secret access key** , and you assure that your user has proper access to the **AWS Elemental MediaConnect** functionality, you can integrate **AWS Elemental MediaConnect** into your application by following these steps:

1. Go to the qibb **Workflow Editor** and open the **Node Catalog** in the right sidebar.

2. Install the **AWS Elemental MediaConnect** node by clicking the + button.

3. Drag and drop the **AWS Elemental MediaConnect** node from the left sidebar into your workflow.

4. Enter your **Region** , **Access key** , and **Secret access key** in the node's **Connection** settings (first dropdown).

5. Select the desired operation from the **AWS Elemental MediaConnect** node.

6. Start using the integration!

   ![image-20251222-134742.png](https://docs.qibb.com/__attachments/a_c95c9462c9415c2b552d92ddb8aaceadc0998c34de6d27293054f9cd255a0a02/image-20251222-134742.png?cb=81f397063962a7d05579b33a5765e573)

If you are not familiar with AWS or the qibb Workflow Editor, additional resources or technical expertise may be necessary to ensure proper integration setup.

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AWS Elemental MediaConvert

## Introduction

AWS Elemental MediaConvert is a powerful cloud-based video transcoding service provided by Amazon Web Services (AWS). It simplifies the process of converting media files into various formats, making them compatible with a wide range of devices and streaming platforms. With MediaConvert, users can effortlessly transcode video and audio files, optimize them for different resolutions and bitrates, and apply custom settings to meet specific requirements.

You can find more details as well as a list of supported operations on [AWS Elemental MediaConvert \| qibb Catalog](https://www.qibb.com/integrations/aws-elemental-mediaconvert-nodes/).

## How to get started with AWS Elemental MediaConvert integration

Before using **AWS Elemental MediaConvert** integration, make sure you have the necessary permissions for the operations.

1. You need an **Access key** , **Secret access key** , and **Region** information of your AWS account for authentication.

2. To list the access keys for an IAM user (console), sign in to the AWS Management Console, and open the [IAM console](https://console.aws.amazon.com/iam/). In the navigation pane, choose **Users** , select the user you want, and then choose the **Security credentials** tab.

   ![transcribe-1.png](https://docs.qibb.com/__attachments/a_85b4d7dd4525e7b74cf2175c5164200ef98363342d7f0e6f69d6f91fd34bbb4d/transcribe-1.png?cb=1bc58eae6d071ff88a1928fbb574e2fa)
3. If you don't have an **Access key** and **Secret access key** , create a new access key. Click the **Create access key** button, select **Application running outside AWS** , and click **Next**.

4. You can set an optional description tag in the next page. Click the **Create access key** button to continue.

5. Copy your **Access key** and **Secret access key** and save it for later use. Note that you can only copy the **Secret access key** on this page.

   ![transcribe-3.png](https://docs.qibb.com/__attachments/a_2793fdbb9e4fa18da666a2f56cd64f82a9d1d469dd5276b71253b096da60a90a/transcribe-3.png?cb=8bdfb7fa929545d52a2b5ec0134b7d37)
6. In the qibb **Workflow Editor** , open the **Node Catalog** in the right sidebar and install the **AWS Elemental MediaConvert** node by clicking the + button.

7. Drag and drop the **AWS Elemental MediaConvert** node from the left sidebar to your workflow.

8. Enter your **Region** , **Access key** , and **Secret access key** in the node's **Connection** settings (first dropdown).

   ![image-20251223-102730.png](https://docs.qibb.com/__attachments/a_25e15e9c695e273e11a584ae09575401cfcb2ee2da382f6a1b2c595c13bcdcd1/image-20251223-102730.png?cb=5af2f3efdf75c48a7cfa4f814e1845db)

9. Retrive **AWS Elemental MediaConvert** [FIPS Endpoints](https://docs.aws.amazon.com/mediaconvert/latest/apireference/important-notes.html#fips-endpoints).

   If you don't have the FIPS endpoint URL yet, you can use this AWS Elemental MediaConvert example flow. This will retrieve the URL and store it in the flow context data under the path `flow.mediaconvert_endpoint`.

   ![2023-09-13_13-05-31.png](https://docs.qibb.com/__attachments/a_8a514802488811b1fc7cd8e4f6e5cea9f659378702b8f0a265b231cf9fbdcd17/2023-09-13_13-05-31.png?cb=3485e5502ee2536a82371ae7df3302d2)

   According to AWS Elemental MediaConvert documentation, developers should avoid making frequent requests to the public endpoint.

If you request your endpoint programmatically, do so only once in your application. Don't make a request to the public endpoint each time that you make a request to MediaConvert. Otherwise, you will reach the throttle maximum on the public API endpoint.

10. Inject FIPS endpoint URL to API node

    ![image-20230913-053039.png](/__attachments/a_e3419750da78c6c657b306e71323ccf0767fea6927370a4e9f971ad940747e42/image-20230913-053039.png?cb=a3d42690aefa65c6908afdc720a50d41)
11. Once you complete these steps you can select any of the operations of the**AWS Elemental MediaConvert** node and start using the integration!

If you're not familiar with AWS or the qibb Workflow Editor, we recommend consulting additional resources or seeking guidance from a technical expert to ensure that you set up the integration correctly.

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AWS Rekognition

## Introduction

**AWS Rekognition** is a cloud-based image and video analysis service that uses deep learning models to automatically identify and label objects, people, text, and activities within images and videos. It can also detect and recognize faces, perform facial analysis to determine emotions and expressions, and compare faces across multiple images. With real-time analysis and the ability to quickly process large volumes of media files, **AWS Rekognition** is ideal for a wide range of applications, including security and surveillance, content moderation, and media management.

You can find more details and the supported operation on [AWS Rekognition \| qibb Catalog](https://www.qibb.com/integrations/aws-rekognition/).

## How to get started with AWS Rekognition integration

Before integrating **AWS Rekognition** into your application, make sure that you have the necessary permissions to perform the required operations.

To get started, you will need your **Access key** , **Secret access key** , and **Region** information for authentication. If you do not already have an Access key and Secret access key, you can create them by following these steps:

1. Sign in to the AWS Management Console and open the [IAM console](https://console.aws.amazon.com/iam/).

2. In the navigation pane, choose **Users** , select the name of the intended user, and then choose the **Security credentials** tab.

   ![transcribe-1.png](https://docs.qibb.com/__attachments/a_1de8ce65b1e3093c1a1d8f15f6cf96f79d849f0c992505be73b18bb74b9368b3/transcribe-1.png?cb=1bc58eae6d071ff88a1928fbb574e2fa)

3. Click the **Create access key** button, select **Application** running outside AWS, and then click **Next**.

4. (Optional) Set a description tag, and then click **Create access key** to continue. Copy your **Access key** and **Secret access key** and save them for later use.

   ![67977d37-1555-48e8-9a18-24069c8ad109.png](https://docs.qibb.com/__attachments/a_2679340000d61b32f20d5b01a6103f3b28b716428a47828ec481de168c0cc3e3/67977d37-1555-48e8-9a18-24069c8ad109.png?cb=e12bd85b7346e8861bc95faa6b0fc9b4)

Once you have your **Access key** and **Secret access key** , you can integrate **AWS Rekognition** into your application by following these steps:

1. Go to the qibb **Workflow Editor** and open the **Node Catalog** in the right sidebar.

2. Install the **AWS Rekognition** node by clicking the + button.

3. Drag and drop the **AWS Rekognition** node from the left sidebar into your workflow.

4. Enter your **Region** , **Access key** , and **Secret access key** in the node's **Connection** settings (first dropdown).

5. Besides, an **X-Amz-Target** should be entered as a parameter. After you select an operation, **X-Amz-Target** will be visible on the node.

   ![image-20251223-104134.png](https://docs.qibb.com/__attachments/a_39989c0c8918accfa3898be0eeccaada35cfad5d87855055ee4083b8c06c4b8e/image-20251223-104134.png?cb=d14b1280dd01e45e71013ef331f61ea5)

6. Select the desired operation from the **AWS Rekognition** node.

7. Start using the integration!

   ![image-20251223-103934.png](https://docs.qibb.com/__attachments/a_9033683eb38012d766a65933fff68875fea77141c04a210115fa66e1fd672d1d/image-20251223-103934.png?cb=ef8fc753d311b24c2ea9a2edf6a52964)

If you are not familiar with AWS or the qibb Workflow Editor, additional resources or technical expertise may be necessary to ensure proper integration setup.

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AWS S3

## Introduction

**Amazon Simple Storage Service (Amazon S3)** is an object storage service that provides scalable, secure, and highly available storage for any amount of data. **Amazon S3** can be used for a variety of use cases, including data lakes, websites, mobile applications, backup and restore, archive, enterprise applications, IoT devices, and big data analytics. With **Amazon S3**, you can manage, organize, and configure access to your data to meet your specific business, organizational, and compliance requirements.

To learn more about **Amazon S3** and its supported operations, visit [AWS S3 \| qibb Catalog](https://www.qibb.com/integrations/aws-s3/).

## How to get started with AWS S3 integration

Before using **AWS S3** integration, make sure you have the necessary permissions for the operations.

1. You need an **Access key** , **Secret access key** , and **Region** information of your AWS account for authentication.

2. To list the access keys for an IAM user (console), sign in to the AWS Management Console, and open the [IAM console](https://console.aws.amazon.com/iam/). In the navigation pane, choose **Users** , select the user you want, and then choose the **Security credentials** tab.

   ![transcribe-1.png](https://docs.qibb.com/__attachments/a_0efaec2f58ef83b6f3d6c2b064fa741a5544bd03851f7350bf79d4ff6427d31b/transcribe-1.png?cb=1bc58eae6d071ff88a1928fbb574e2fa)
3. If you don't have an **Access key** and **Secret access key** , create a new access key. Click the **Create access key** button, select **Application running outside AWS** , and click **Next**.

4. You can set an optional description tag in the next page. Click the **Create access key** button to continue.

5. Copy your **Access key** and **Secret access key** and save it for later use. Note that you can only copy the **Secret access key** on this page.

   ![transcribe-3.png](https://docs.qibb.com/__attachments/a_7cffffa6ecc09e7c11d3352dc6af4661dc9b4950328966c0d28d1639716c1574/transcribe-3.png?cb=8bdfb7fa929545d52a2b5ec0134b7d37)

6. In the qibb **Workflow Editor** , open the **Node Catalog** in the right sidebar and install the **AWS S3** node by clicking the + button.

7. Drag and drop the **AWS S3** node from the left sidebar to your workflow.

8. Enter your **Region** , **Access key** , and **Secret access key** in the node's **Connection** settings (first dropdown). Select an operation in the **AWS S3** node and start using the integration.

   ![image-20251223-112739.png](https://docs.qibb.com/__attachments/a_6e284d80efdd19fd1ce9f13aa0baa1cc3ec61920cc9ac983d3063204dd2a1afb/image-20251223-112739.png?cb=ee3f6f149e4f90dcfeaab6bdba8c3f63)

If you're not familiar with AWS or the qibb Workflow Editor, we recommend consulting additional resources or seeking guidance from a technical expert to ensure that you set up the integration correctly.

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# AWS Secret Manager

## Introduction

The AWS Secret Manager node integrates with **AWS Secrets Manager**service. It automatically fetches a configured AWS secret and exposes it in the global context, so that it can be accessed throughout your flow.

* The synchronized secret is stored under: `AWS_SECRETS`

* Additional metadata is stored under: `AWS_SECRETS_METADATA`

* The node can automatically synchronize secrets after saving a flow and periodically refresh them in the background.

## Configuration

Place a single instance of the node into your flow. Once deployed, it will regularly sync secrets from AWS.  
![AWS_Secret_Manager_Node.png](https://docs.qibb.com/__attachments/a_c0e02280c371bb56b5f732222c62a3077438268d1cfd6e54099a7b20b4770687/AWS_Secret_Manager_Node.png?cb=707d882cf8790d9bd3a28fb9030196db)  
Avoid dropping multiple instances of this node. Only one instance of this node is required.  
![aws_secret_manager_configuration.png](https://docs.qibb.com/__attachments/a_25edb65acd63db182069f1f0dd420addba3018f37e73cd84c564af8de1fd9851/aws_secret_manager_configuration.png?cb=dd39a2b2f9a2d6807f25758f42f04bba)
Double-click on the node to open the node properties

The AWS Secret Manager node offers the following configuration options:  

|           Property           |                                      Description                                       |
|------------------------------|----------------------------------------------------------------------------------------|
| **Autosync**                 | Defines how often the secret is synchronized from AWS Secrets Manager.                 |
| **Sync on Save**             | Defines whether the secret should be synchronized after the flow is saved or deployed. |
| **AWS Region**               | The AWS region in which the secret is stored, for example `eu-central-1`.              |
| **AWS Secret ID or ARN**     | The name or ARN of the AWS Secrets Manager secret to retrieve.                         |
| **AWS Secret Version Stage** | Defines the secret version stage. The default is `AWSCURRENT`.                         |
| **Authentication Method**    | Defines whether the node authenticates using an AWS Access Key or an IAM Role.         |

## Authentication

### AWS Access Key

When **AWS Access Key** authentication is selected, the credentials must be stored in qibb's Secret Manager under:

`AWS_SECRET_MANAGER_ACCESS_KEY`

The secret must have the following JSON structure:
JSON

    {
      "ID": "****",
      "SECRET": "****"
    }

The qibb secret must already be synchronized to the flow. The node reads the credentials from:

`SECRETS.AWS_SECRET_MANAGER_ACCESS_KEY.ID`

and:

`SECRETS.AWS_SECRET_MANAGER_ACCESS_KEY.SECRET`

If the credentials are not available, the AWS secret synchronization will not start.

### AWS IAM Role

ULTIMATE

This feature requires an Ultimate Subscription.

When **AWS IAM Role** authentication is selected, the node uses the AWS identity assigned to the qibb runtime.

No AWS Access Key is required.

The underlying infrastructure must already be configured with an IAM role or equivalent AWS workload identity that has permission to retrieve the configured secret.

* For **qibb Ultimate SaaS**: qibb Support must configure this and set up an AssumeRole for cross-account permissions; request these changes via a support ticket.

* For **qibb Ultimate PaaS**: qibb Support can provide scripts on request to allow the customer's platform administrator to perform this as a self-service task.

## Accessing secrets from your flow

After a successful synchronization, the AWS secret is available in the global context.

For example:
JavaScript

    const secrets = global.get("AWS_SECRETS");

    const username = secrets.username;
    const password = secrets.password;

If the stored AWS secret contains valid JSON, it is automatically parsed into a JavaScript object. Plain-text secrets are stored as strings.

Additional information about the synchronized AWS secret can be accessed using:
JavaScript

    const metadata = global.get("AWS_SECRETS_METADATA");

## Synchronization and retries

The node automatically refreshes the secret according to the configured **Autosync** interval.

If synchronization fails, the node retries automatically with a short randomized delay. After **5 consecutive failed attempts**, automatic retries stop and the node reports an error status.

A successful synchronization resets the retry counter.

## AWS permissions

The AWS identity used by the node requires permission to retrieve the configured secret.

Typically, the following permission is required:

`secretsmanager:GetSecretValue`

If the secret uses a customer-managed AWS KMS key, additional KMS permissions may be required.

---
language: "en"
---
# Ayrshare

## Introduction

​**Ayrshare**gives you the tools to send and manage social media posts via a unified API. You can schedule social media posts to Twitter, Facebook Pages and Groups, LinkedIn, Instagram, YouTube, Reddit, Google Business Profile (formerly Google My Business), Pinterest, TikTok, and Telegram via a REST API. You can post to all your, or your user's, linked social networks with a single API call.

* Send real-time or scheduled posts to your social media accounts from your platform.

* Post any content including text, images, or videos to one or multiple social networks.

* Get up and running in minutes with a few lines of code with easy to use examples.

You can find more details and the supported operations on [Ayrshare \| qibb Catalog](https://www.qibb.com/integrations/ayrshare/).

## How to get started with Ayrshare integration

Before you get started using **Ayrshare** integration please make sure that you have the needed permission for the operations. Here you can find the [Ayrshare API Documentation](https://docs.ayrshare.com/rest-api/overview).

1. You will need an **API Key**for authentication.

   ![ayrshare.png](https://docs.qibb.com/__attachments/a_fcf03aac95c99f162655e57b0da4de0d9def1a6f10be9d5e80805b645c9fdae1/ayrshare.png?cb=653e35019dd4b6f50f44605570e51880)
2. The **API Key** can be found in the **Ayrshare Dashboard** by switching to your Primary Profile. Copy your **API Key** to use it later.

   ![ayrshare-2.png](https://docs.qibb.com/__attachments/a_8e518ec16ef0532db6ef2b4a13a5d11e3ca7c08e69946c1ba746b60da3fb6b9a/ayrshare-2.png?cb=1069ddcec461dbdc3907eea77d4839d6)
3. Go to qibb **Workflow Editor** , open **Node Catalog** in the right sidebar, and install **Ayrshare** node by clicking on the **+** button.

4. Drag the **Ayrshare**node and any other nodes you need from the left sidebar and place them in your flow.

5. Enter your **API Key** in the node's **Connection** settings (first dropdown) and start using the integration.

   ![image-20251223-114955.png](https://docs.qibb.com/__attachments/a_777a55b4160690f19f2e32c33c7ffba766ac3d7318492bd0e27c822669fe0bc4/image-20251223-114955.png?cb=c453234847a6db4317dc5a2885f0272a)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Azure AI Speech

## Introduction

The **Azure AI Speech Service** provides speech-to-text and text-to-speech capabilities with a Speech resource. You can transcribe speech-to-text with high accuracy, produce natural-sounding text-to-speech voices, translate spoken audio, and use speaker recognition during conversations.

Create custom voices, add specific words to your base vocabulary, or build your own models. Run Speech anywhere, in the cloud or at the edge in containers. It's easy to speech-enable your applications, tools, and devices with the Speech CLI, Speech SDK, Speech Studio, or REST APIs.

Use **Azure Speech Services API** for:

* **Custom Speech:** With Custom Speech, you can upload your own data, test and train a custom model, compare accuracy between models, and deploy a model to a custom endpoint. Copy models to other subscriptions if you want colleagues to have access to a model that you built, or if you want to deploy a model to more than one region.

* **Batch Transcription:** Transcribe audio files as a batch from multiple URLs or an Azure container.

**Azure Speech Services API** includes such features as:

* Get logs for each endpoint if logs have been requested for that endpoint.

* Request the manifest of the models that you create, to set up on-premises containers.

* Upload data from Azure storage accounts by using a shared access signature (SAS) URI.

* Bring your own storage. Use your own storage accounts for logs, transcription files, and other data.

* Some operations support webhook notifications. You can register your webhooks where notifications are sent.

You can find more details and the supported operation on [Azure AI Speech Service \| qibb](https://www.qibb.com/integrations/azure-ai-speech/).

## How to get started with Azure AI Speech Serviceintegration

Before you begin, ensure that you have the necessary permissions to perform the integration. When you have your Azure AI Speech Service, you can follow the steps below to get started:

1. Obtain your **API Key** for authentication purposes.

   1. Navigate to your **Azure Speech Services** directory.

      ![image-20230816-130204.png](/__attachments/a_82a0176d37f660d4aed9c868d6325b06857adc9285c5e07f0fa011da2db378fb/image-20230816-130204.png?cb=573f6a3449a85fc0608429bc18aea496)

   2. Choose the Speech App which you want to manage and which credentials you want to use.

      ![image-20230816-130658.png](/__attachments/a_86be1e1f9bb2700c59b4f39aed22e5f8e3c132149772dbeb650d22ba6ec3a0e4/image-20230816-130658.png?cb=d8c88e7a4033b0900480eaa73f50c93e)

   3. Choose Keys and Endpoint. Your**API Key** is the valuetaken from the **KEY 1** field. Your **Host URL** is the host part, taken from the **Endpoint** field (Example: `https://eastus.api.cognitive.microsoft.com`). The Host URL you will need if you use a server different than `eastus.api.cognitive.microsoft.com`. By default the **Azure AI Service node** support `eastus.api.cognitive.microsoft.com` host.

      ![image-20230816-131411.png](/__attachments/a_7a298209a162d93bb2dbca9ccf45dad4abc2198dc16d7bae46d4b4194aa11292/image-20230816-131411.png?cb=8f04e3a24ede19b80cbbf32eeb9faa74)

2. Open the qibb **Workflow Editor** and click on the **Node Catalog** button in the right sidebar. Install the **Azure AI Speech** nodes by clicking on the **+** button.

3. Drag the **Azure AI Speech Service API**node, and any other nodes you require from the left sidebar to your flow and connect them.

4. Open the **Azure AI Speech Service API** node you want to use, expand the **Connection** dropdown (the first dropdown), and enter your **API Key** in the connection settings. If you are using a Host URL different from the default (`https://eastus.api.cognitive.microsoft.com`), enter it in the **Host** field. Then select an operation and start using the integration.

   ![image-20251223-120030.png](https://docs.qibb.com/__attachments/a_0449dac68cf233b54483989f4b70eaaa24a46a8ae546fef5117fd2ddb6794185/image-20251223-120030.png?cb=5d9d225fb5d4bbdbd5fb3fdf2592251d)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Azure AI Vision

## Introduction

**Azure AI Vision** is a unified service that offers innovative computer vision capabilities. Give your apps the ability to analyze images, read text, and detect faces with prebuilt image tagging, text extraction with optical character recognition (OCR), and responsible facial recognition. Incorporate vision features into your projects with no machine-learning experience required.

The Computer Vision API provides state-of-the-art algorithms to process images and return information. For example, it can be used to determine if an image contains mature content, or it can be used to find all the faces in an image. It also has other features like estimating dominant and accent colors, categorizing the content of images, and describing an image with complete English sentences. Additionally, it can also intelligently generate image thumbnails for displaying large images effectively.

You can find more details and the supported operation on [Azure AI Vision \| qibb](https://www.qibb.com/integrations/azure-ai-vision/).

## How to get started with Azure AI Visionintegration

Before you begin, ensure that you have the necessary permissions to perform the integration. When you have your Azure AI Vision account, you can follow the steps below to get started:

1. Obtain your **API Key** for authentication purposes.

   1. Navigate to your **Azure Computer Vision** directory.

      ![image-20230822-064951.png](/__attachments/a_ab2d8f3e9c7a52cb81bf4ed2123ce486bda4563805941a29b59d52ca30c61a08/image-20230822-064951.png?cb=c3cf100bc55e483a12f43f6df43e9d7a)
   2. Choose the Vision App which you want to manage and which credentials you want to use.

      ![image-20230822-065252.png](/__attachments/a_fe935902cfc34eee1a56950ada59df56e51d84148f0e5444c084882be26c6cfe/image-20230822-065252.png?cb=422f566ec4abd615431d23d230b3e910)
   3. Choose Keys and Endpoint. Your**API Key** is the valuetaken from the **KEY 1** field. Your **Host URL** is the host part, taken from the **Endpoint** field (Example: `https://eastus.api.cognitive.microsoft.com`). By default, the **Azure AI Vision node** uses `eastus.api.cognitive.microsoft.com` host.

      You can have a custom domain name for your App as well. In such a case you need to exchange the Host with the custom one you have given to your App.

      ![image-20230822-065729.png](/__attachments/a_7ee90645e3f92edda2cd7642ecb7fe35843dc7b7e5fa97f05772e37a793994fc/image-20230822-065729.png?cb=39166461d86d40dded82bc0cc1151e73)
2. Open the qibb **Workflow Editor** and click on the **Node Catalog** button in the right sidebar.

   Then install the **Azure AI Vision** nodes by clicking on the **+** button.

3. Drag the **Azure AI Vision Service API**node, and any other nodes you require from the left sidebar to your flow and connect them.

4. Open the **Azure AI Vision Service API** node you want to use, select an operation, and add the **API Key** as part of the apiKey field in the Advanced section. If you are using a Host URL different than the default one (`https://eastus.api.cognitive.microsoft.com`) then you can fill in the `Host` input field.

   Now, you can start using the integration!

   ![image-20230822-070720.png](https://docs.qibb.com/__attachments/a_e32a452e983d9022ddd0bda6eb26fc3f3d4813e548ca4c00ad87e4ced1f78771/image-20230822-070720.png?cb=86e684b1cb82a031380354fb986da8e2)

If you need to change the `Host` name, do not forget to check if the `baseURL` is attached to the hostname as well.

**Example:** The latest version of the `baseUrl` is `/vision/v3.2`. In this case, your Host will become: `https://yourNewHost.com/vision/v3.2`  
![image-20230822-105802.png](https://docs.qibb.com/__attachments/a_d63e7a850298906e71f0ef9c5882c996d2a195bbcda05b888fc4f1d2d8a5a962/image-20230822-105802.png?cb=ddb7656ce4ca83a5a8229764e941a28e)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Azure Cost Management

## Introduction

Microsoft Azure Cost Management is a tool used to monitor, analyze, and optimize the expenses associated with using Microsoft Azure cloud services. It provides users with insights into their cloud spending, helping them understand where their resources are being utilized and identify potential cost-saving opportunities.

Azure Cost Management allows users to track usage patterns, set budgets, and receive alerts when spending exceeds predefined thresholds. It also offers detailed reports and visualizations that assist in identifying areas for cost reduction, such as idle or underutilized resources. Overall, Azure Cost Management helps businesses and individuals manage their Azure cloud expenses effectively and make informed decisions to optimize their cloud usage.

You can find more details and the supported operation on [Azure Cost Management \| qibb](https://www.qibb.com/integrations/azure-cost-management/).

## How to get started with Azure Cost Management integration

Before you begin, ensure that you have the necessary permissions to perform the integration.

1. Obtain your **Client ID** , **Client Password** , and **Tenant ID** for authentication purposes.

   1. Use the search bar on your Azure Dashboard to search for **Azure Active Directory** and click on the **Service**.

   2. ![image-20230824-114956.png](https://docs.qibb.com/__attachments/a_6a92797329ecf7081f97896c09a81e30d90c05eb6d99bd002ff1a8633be2d961/image-20230824-114956.png?cb=3756040a4af1f29aba84028f218526f2)

      Your **Tenant ID** is displayed on the starting page of the **Azure Active Directory**.
   3. ![image-20230824-115017.png](https://docs.qibb.com/__attachments/a_55c3d9fe63ffb61e6b92e351f5d9355bb933cf4221fda4064ecbf7299c10f6b6/image-20230824-115017.png?cb=cd529357d85933b6b15e333573638e2f)

      In the left toolbar select **App registrations**.
   4. ![image-20230824-115047.png](https://docs.qibb.com/__attachments/a_922ce263bb4daf1e7966ee46f97f893d54339937d2fb745606379999532f4cff/image-20230824-115047.png?cb=cb4f40c6b54d880a72bc593b68133954)

      Locate your application. Your **Application (client) ID**is displayed here as well. Click on your application name.
   5. ![image-20230824-115058.png](https://docs.qibb.com/__attachments/a_ec1856f59e3a55ef78485a2e2639d67b17f4651d50884c7accdcd370e5bfb52f/image-20230824-115058.png?cb=cf72da0a72749e0d37ba8b816580fa80)

      In the left toolbar select **Certificates \& secrets**.
   6. ![image-20230824-115119.png](https://docs.qibb.com/__attachments/a_372ffe07d90a0254e9cec5da025b46ae9e62bac282de54ae890237d458b5bc9c/image-20230824-115119.png?cb=0479caa52f85ebf107055f8f0a264bbb)

      Click the link for your Client credentials.
   7. ![image-20230824-115130.png](https://docs.qibb.com/__attachments/a_21b42326d85351a8e5e9e8e765985ef516c1d58ffeacb2060b85432a56ea6029/image-20230824-115130.png?cb=0265f0836ff38a702a80c7b0021a7bc9)

      Your**Client Password** is the **Value** associated with your **Secret ID**. Secret values can only be viewed immediately after creation. Be sure to store your secret value in a secure location for use in your project.  
      ![image-20230824-115154.png](/__attachments/a_b39f2be91a6eb7c4e64b697175f2e7e8af2217224734fa67b793a607de0da362/image-20230824-115154.png?cb=3cb16a35df2525f80b4c1e2fac32d36a)
2. Make note of your **Api-Version** , which you will include as a query parameter. Microsoft provides this documentation: [Azure Cost Management REST API reference](https://github.com/APIs-guru/openapi-directory/tree/main/APIs/azure.com/cost-management-costmanagement).

3. Open the qibb **Workflow Editor** and click on the **Node Catalog** button in the right sidebar. Install the **Azure Cost Management** nodes by clicking on the **+** button.

4. Drag and drop the **Azure Cost Management Auth** and **Azure Cost Management API** nodes from the left sidebar to your workflow and connect them to build the workflow you need.

5. Enter your credentials in the **Client ID** ,**Client Password** ,and**Tenant ID** fields in the **Azure Cost Management Auth**node.

   ![azure-cost-management-auth.png](https://docs.qibb.com/__attachments/a_5d563f45ce51f833c519596b270fd1ff3e40afc62a12b73356c6104497dfb7c6/azure-cost-management-auth.png?cb=8d1f0c05e9fa9669e006c7b37418b445)
6. Enter your **API-Version** parameter and any other necessary parameters into the **Azure Cost Management API**nodes and start using the integration!

   ![azure-cost-management.png](https://docs.qibb.com/__attachments/a_ebf7077d09079158b240b51d31c49bc786775cf89f5c9109ace328543b883046/azure-cost-management.png?cb=2cbc2021e6aff0388c53c296f04653ad)

### Additional resources:

[Microsoft Cost Management REST APIs](https://learn.microsoft.com/en-us/rest/api/cost-management/)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Azure OpenAI

## Introduction

**Azure OpenAI Service** provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series. In addition, the new GPT-4 and ChatGPT (gpt-35-turbo) model series have now reached general availability. These models can be easily adapted to your specific task including but not limited to content generation, summarization, semantic search, and natural language to code translation.

Functionality for Azure OpenAI Service is split into two nodes:

1. **Azure OpenAI Authoring** includes APIs for fine-tuning and managing deployments of OpenAI models.

2. **Azure OpenAI Inference** includes APIs for completions and search.

You can find more details and the supported operation on [Azure OpenAI \| qibb](https://www.qibb.com/integrations/azure-openai/).

## How to get started with Azure OpenAI Serviceintegration

Before you begin, ensure that you have the necessary permissions to perform the integration. When you have your Azure OpenAI Service, you can follow the steps below to get started:

1. Obtain your **Client ID** , **Client Password** , and **Tenant ID** for authentication purposes.

   1. Use the search bar on your Azure Dashboard to search for **Azure Active Directory** and click on the **Service**.

      ![azure2.png](/__attachments/a_981f18564ae6605d128e382e5f7e2947e13a0b67b346a006cdb466a383ba15c5/azure2.png?cb=3d13f87e6690454669d35262352c7d08)
   2. Your **Tenant ID** is displayed on the starting page of the **Azure Active Directory**.

      ![azure3.png](/__attachments/a_d2a8260f03186e2eaec01cc441b60ce830ce939cd8436aa728e1ba68246032c5/azure3.png?cb=5cc01d1e046af748518eb6f3345201b8)
   3. In the left toolbar select **App registrations**.

      ![azure4.png](/__attachments/a_99a4207ddb90e5b8f6f9539fb9b83ae77fd16698109120cbacdb26cd87828a46/azure4.png?cb=fbdfd44575239f79df2d79bf652b5c5f)
   4. Locate your application. Your **Application (client) ID**is displayed here as well. Click on your application name.

      ![azure5.png](/__attachments/a_4aef80b7479e86daf788745193ce174c1b22fea6fc5fe45d79b1f340cb62e081/azure5.png?cb=164b363b82fc610758756144babdf515)
   5. In the left toolbar select **Certificates \& secrets** .

      ![azure6.png](/__attachments/a_7f987cb5e272a06107247440de89cca93c18292cfeca71725c695f9bd14da3ee/azure6.png?cb=88da0261ab8effe312d32b677794725d)
   6. Click the link for your Client credentials.

      ![azure7.png](/__attachments/a_0af1070add03a90ce91f18f6dbdf66c768e59a52b9ff636f1007c78c3e97416d/azure7.png?cb=4deb569242fb19b6351dd72014ab2e4a)
   7. Your**Client Password** is the **Value** associated with your **Secret ID** . Secret values can only be viewed immediately after creation. Be sure to store your secret value in a secure location for use in your project.

      ![azure8.png](/__attachments/a_af42e7a729f1f421f5f0483e02237d031cd4dc28b7505f08d42b25d8b159ddf9/azure8.png?cb=4040e104e7d9fbf3e4174f9a46c5daa8)
2. Locate your **Host URL**.

   ![azure1.png](https://docs.qibb.com/__attachments/a_96762ae41120f74cc247970ea0d5039ac28713bc2aa828d9a5beca90d3fc5fd1/azure1.png?cb=e23b6c2652a9774f2c55a0ba8bcbcc98)
3. Make note of your **Api-Version** , which you will include as a query parameter. Microsoft provides this documentation: [Azure OpenAI Service REST API reference](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference).

   **Note** : qibb makes the **Api-Version** visible when editing the node settings. See the blue boxes in the screenshot for step 7.

4. Open the qibb **Workflow Editor** and click on the **Node Catalog** button in the right sidebar. Install the **Azure OpenAI** nodes by clicking on the **+** button.

5. Drag and drop the **Azure OpenAI Authoring** and **Azure OpenAI Inference** nodes from the left sidebar to your workflow and connect them to build the workflow you need. In the following example the flow example '**Azure OpenAI Authoring Example Flow**' is used.

6. Enter your credentials in the **Client ID** ,**Client Password** and**Tenant ID** fields in the **inject**node.

   ![image-20251229-092440.png](https://docs.qibb.com/__attachments/a_6133f71ec3abfaf9e89eadf57a61473efbbd8298662cab3b4b3cb78480e87ce2/image-20251229-092440.png?cb=65ced740fb661d954bc898574510b70c)

7. Enter your **Api-Version** parameter and any other necessary parameters into the **Azure OpenAI Authoring** and/or **Azure OpenAI Inference**nodes and start using the integration!

   ![image-20251229-092452.png](https://docs.qibb.com/__attachments/a_b0b24166d59824912aff8924052c36f37737135b1318845d6938288d6514b7ed/image-20251229-092452.png?cb=2253994434bcacceb1e1cfdaa683f5f5)

### Additional resources:

[Azure OpenAI Service - Documentation, quickstarts, API reference](https://learn.microsoft.com/en-us/azure/ai-services/openai/)

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Azure Video Indexer

## Introduction

Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series. In addition, the new GPT-4 and ChatGPT (gpt-35-turbo) model series have now reached general availability. These models can be easily adapted to your specific task including but not limited to content generation, summarization, semantic search, and natural language to code translation.

You can find more details and the supported operation on [Azure Video Indexer \| qibb](https://www.qibb.com/integrations/azure-video-indexer/)..

## What is Azure Video Indexer?

Azure Video Indexer leverages AI to extract rich metadata from video content, including transcripts, keywords, topics, people, and emotions. The service enables users to search, browse, and discover video content more efficiently, unlocking new possibilities for media production, advertising, and customer engagement.

### Use cases and applications:

* **Media and entertainment:** Azure Video Indexer helps media companies manage their video archives, streamline content discovery, and create engaging user experiences.

* **Advertising:** By extracting key moments and topics from videos, Azure Video Indexer enables ad insertion and targeting, increasing the effectiveness of video campaigns.

* **Corporate training:** With Azure Video Indexer, companies can analyze and tag training videos, making them more searchable and accessible to employees.

## How to get started with **Azure Video Indexer** integration

Before you begin, ensure that you have the necessary permissions to perform the integration. Follow the steps below to get started:

1. Obtain your **Location** , **Account ID** , and **Subscription Key** for authentication purposes.

2. Refer to the Regions in which Azure Video Indexer is available page on the [Azure Video Indexer website](https://learn.microsoft.com/en-us/azure/azure-video-indexer/regions) to learn more about supported regions.

3. Log in to your Azure Video Indexer account and navigate to the User accounts page to find your Location and Account ID. Please note that the Location should be in JSON format, for example, "eastus" instead of "East US".

   ![azure-1.png](https://docs.qibb.com/__attachments/a_17420da6e1da628c8603a4d21bff8c31e140108cbefb0064081648a662ede35b/azure-1.png?cb=75e484cc50889cf8150f33a5daebd901)
4. Your **Account ID** can be found under your username and location information. You can also click on the **Settings** button to access your Account ID.

5. Your **Subscription Key** can be found on the **User Profile** page. Click on <https://api-portal.videoindexer.ai/profile> to access the page.

   ![image-20230223-105316.png](https://docs.qibb.com/__attachments/a_8108c57ad2a02dd30278285054ae01dd81e641019cf5106382f8dec4a69ceb79/image-20230223-105316.png?cb=fa15fb1acd20e35a6452391c1a27df73)
6. Open the qibb **Workflow Editor** and click on the **Node Catalog** button in the right sidebar. Install the **Azure Video Indexer** node by clicking on the + button.

7. Drag and drop the **Azure Video Indexer Auth** and **Azure Video Indexer Client** nodes from the left sidebar to your workflow and connect them.

8. Enter your credentials in the **Location, Account ID** ,and **Subscription Key fields**, and start using the integration!

   ![image-20230223-105658.png](https://docs.qibb.com/__attachments/a_4a245509783004350388606f419e7dc2089e52f507fcaaba9dac2b9be77366cd/image-20230223-105658.png?cb=faeda473f7995c944969b745856d3fa6)

### Additional resources:

* Azure Video Indexer documentation: <https://docs.microsoft.com/en-us/azure/media-services/video-indexer/>

* Azure Video Indexer support: <https://azure.microsoft.com/en-us/support/>

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

---
language: "en"
---
# Basic Nodes Assignment

## **Introduction**

In this assignment, you will create a Node-RED workflow that makes use of the `inject`, `debug`, `switch`, `change`, `template`, and `function` nodes. The goal is to deepen your understanding of these nodes and their capabilities.

## Assignment

### Inject Node and Data Generation

1. Add an `inject` node to your flow.

2. Configure the `inject` node. Add a couple of new properties to the `msg` object:

   1. `msg.timestamp` and assign it to a Unix timestamp

   2. `msg.name` and assign it to your first name

### Switch Node

1. Integrate a `switch` node after the `inject` node.

2. Configure the `Switch` node to stop after the first match and route messages based on the following conditions:

   1. Check if the `msg.timestamp` is evenly divided by 2 → route to output 1

   2. Otherwise → output 2

~Hint: You can use~[~JSONata~](https://docs.jsonata.org/overview)~expression for the evaluation.~

### Change Node

1. Connect the outputs of the `Switch` node to `Change` nodes.

2. In the `Change` nodes, set the `msg.parity` to the strings `odd` or `even` depending on whether the number is odd or even

### Template Node

1. Incorporate a `Template` node after each `Change` node.

2. Configure the `Template` nodes to set the `msg.payload` to the following JSON format:

JSON

    {
      "name": msg.name,
      "unixTimestamp": msg.timestamp,
      "parity": msg.parity
    }

Please make sure that the `msg.timestamp` is formatted as a number, and not as a string with `"` around it.

### Function Node

1. Connect each one of the `Template` nodes to a separate `function` node.

2. In the `Function` node:

   1. convert the Unix timestamp to UTC time

   2. using a string literal, assign the `description` constant variable to `This flow has been triggered in HH:MM:SS on DD.MM.YYYY by NAME`

      1. replace the `HH:MM:SS` with the converted time

      2. replace `DD.MM.YYYY` with the converted date

      3. replace `NAME` with the value from `msg.name`

3. At the end of the function node, set the status as **Success**.

### Testing and Debugging of The Flow

1. Place `debug` nodes after each `function` nodes

2. Set the output to `complete message`

3. Set a message counter to each `debug` node

4. Monitor the debug sidebar and verify that everything is according to the requirements

The output of the flow should be a `msg.payload` of the following format:
JSON

    {
      "name": msg.name,
      "unixTimestamp": msg.timestamp,
      "parity": msg.parity,
      "description": description
    }

And your flow should look similar to the one below:  
![2023-11-02_12-14.png](https://docs.qibb.com/__attachments/a_91c7debf7a9995d5ac842f28721b31e648d157bb53e566c1130288bbf290bd4b/2023-11-02_12-14.png?cb=b0f3f22e15c867712c7a4cdd21efb9a5)
Basic Nodes Assignment Solution  
Please note the format of the `msg` object in the debug tab from the screenshot above. Notice how the `function` node visually represents the `Success` status just below it, and how the debug nodes feature a `counter`, indicating the number of times they have been executed.

### Optional Challenge (Extra Credit)

The following optional challenge includes calculating the tokens consumed to encode the `description` and adding them to the `msg.payload`.  
**Tokenization**

For machines and NLP (Natural Language Processing) [LLM](https://www.elastic.co/what-is/large-language-models) (Large Language Model) models, such as [BERT](https://huggingface.co/blog/bert-101)(Bidirectional Encoder Representations from Transformers) or [GPT](https://openai.com/gpt-4)(Generative Pre-trained Transformer), etc., to comprehend human language, a crucial initial step involves the conversion of written words into numerical representations, as computers operate with binary represented data.

This initial step, known as **tokenization**, forms the foundation of (NLP) endeavors. Tokenization entails the segmentation of a given text into discrete units referred to as tokens. These tokens can encompass both words and punctuation marks. Subsequently, these tokens are further transformed into numerical vectors, serving as mathematical representations of the words they represent.

To make sense of these numerical values, we use a special type of computer program called a deep learning model, often a transformer. This model is trained using the numerical vectors obtained through tokenization, enabling it to understand the complexities of word meanings and their contextual relationships.

The ultimate objective is to allow NLP models with the capability to comprehend the semantics and connotations of various words and their contextual placement within sentences or texts. This, in turn, enhances the NLP model's proficiency in understanding and processing human language.

That's why a lot of LLM (Large Language Models) like [ChatGPT](https://openai.com/blog/chatgpt) have a strict limit of the number of tokens consumed both by the prompt and by the output of the model and also have a fixed pricing per token.

Encodings specify how text is converted into tokens. Different models use different encodings. `tiktoken` supports three encodings used by OpenAI models:  

|      Encoding name      |                    OpenAI models                     |
|-------------------------|------------------------------------------------------|
| `cl100k_base`           | `gpt-4`, `gpt-3.5-turbo`, `text-embedding-ada-002`   |
| `p50k_base`             | Codex models, `text-davinci-002`, `text-davinci-003` |
| `r50k_base` (or `gpt2`) | GPT-3 models like `davinci`                          |

1. Import the[](https://www.npmjs.com/package/@dqbd/tiktoken)[tiktoken](https://www.npmjs.com/package/tiktoken)npm package to your function node.

2. Use the `tiktoken` package to calculate the number of tokens needed for this description using the `cl100k_base` encoder.

3. Extend the `msg.payload` with a new property called `tokens`. Assign to it the calculated number of tokens necessary for encoding the `description`.

4. After completing the encoding process, do not forget to free the tiktoken encoder.

A simple web app implementation of `tiktoken` can be found here: <https://tiktokenizer.vercel.app/>  
**Tokens Decoding**

Please note that you can use the `TextDecoder()` [constructor](https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder/TextDecoder) to decode the generated tokens, but this is out of the scope of this exercise.
JSON

    {
      "name": msg.name,
      "unixTimestamp": msg.timestamp,
      "parity": msg.parity,
      "description": description,
      "tokens": tokens
    }

![2023-11-02_13-59.png](https://docs.qibb.com/__attachments/a_c4dd110d78e3702f82c666b19174a8dad324533c7e378b5dda8f226973853aee/2023-11-02_13-59.png?cb=7bacaaf660735203ae71df55ba208561)
Tokens Calculation

## Submission

1. Export your Node-RED flow as a JSON file.

2. Share the JSON file and description as your submission.

Best of luck!

---
language: "en"
---
# Basic Nodes Tutorial

## Introduction

The following tutorial will introduce you to the most common Node-Red nodes, and show you some of their use cases.

## Tutorial Flow Source Code

To explore the nodes featured in this tutorial, simply download the attached JSON file below and import it into your flow app.

[basic_nodes.json](https://docs.qibb.com/__attachments/a_208071d62e5d926fa6f31a405182214de9fd0ab5b6b20442b5ed5829474b06b6/basic_nodes.json.md?cb=418cf665f0e22b99127dadbe8e5c13b5)

You can do this by either pressing `Ctrl + I` simultaneously or by navigating to the main settings and selecting the `Import` option.

## Tutorial

This guide and `basic_nodes.json` flow is split into distinct sections, with each one focusing on a specific node(s). This structured approach ensures that you can easily navigate and find information on the nodes that matter most to your project.

### Inject and Debug Nodes

The first tab shows how the `Inject` and `Debug` nodes work.
Basic Use of Inject and Debug Nodes  
You can use the `Inject` node to start/trigger a flow and also to set various parameters of the `msg` object. For example, you can use it to set the `msg.payload` (payload parameter) to different types like:

* Boolean (`True` or `False`)

* String

* [Unix Timestamp](https://en.wikipedia.org/wiki/Unix_time) (the number of milliseconds since the 1st of January 1970), e.g. `1698676848107` -\> 2023-10-30 `14:40:48.107` UTC

* Number

* Array (please note that this array can be nested and contains objects or nested arrays inside

* Object (JSON object) that can also be nested or contain nested arrays

**Adding New** `msg`**Properties**

You can add new message properties by simply clicking over the **Add** button on the inject node. This would automatically create a new property, that can be configured according to your needs.  
![2023-10-30_18-19.png](https://docs.qibb.com/__attachments/a_e00af9e1a52dd11f8c1e00d8b9d367fcfc8fa333eecbcc19a49504603f4f2768/2023-10-30_18-19.png?cb=5c0514a2df11f8549773df1da13e5b4f)
Adding New `msg` Properties

For example in the below screenshot, we set the `msg.payload` to a boolean value of `True`.  
![2023-10-30_16-36.png](https://docs.qibb.com/__attachments/a_c9ffcdbffbc3991eeecf004d177809233e88adc2b19c4b9ddcb53d66e87bc5ba/2023-10-30_16-36.png?cb=cb515ea8a1b62e78943c586bfed15ad6)
Inject Node, Setting up The `msg.payload`

With the help of the `debug` node, you can display in the Debug Messages tab of your qibb flow editor either the whole `msg` object or a specific property of the `msg` object.

In the below screenshot we are displaying the `msg.payload` in the debug window and the name of the debug node is set to "Debug Node".  
![2023-10-30_17-43.png](https://docs.qibb.com/__attachments/a_6d4a674e4983a2eea3907ed239d48e70f03054099cce28dff6f4e8a067fefb16/2023-10-30_17-43.png?cb=e3e4c1fc6cd5e225a409767f209d841b)
Debug Node  
**Manual Injection**

You can manually trigger the inject node by pressing the small square on the left ot the inject node with your mouse.  
![2023-10-30_18-24.png](https://docs.qibb.com/__attachments/a_a9354915b9b819c73a315eb95abdea35d470def13b2d6c62d811a8d99c56e610/2023-10-30_18-24.png?cb=19dd9d3355fe606adc2cbe349f1ac8f0)
Manual Trigger

After that, the values of the `msg.payload` would be visualized in the debug tab, where it would automatically formatted appropriately. For example:

* Boolean values would be colored in Blue

* Unix timestamps will be automatically converted into UTC, local time, and a hexadecimal representation, which can be easily changed by a simple left click with your mouse over it

* Arrays would automatically recognized and the size of the array would be written in gray

* Objects would be automatically recognized and formatted accordingly

![2023-10-30_17-51.png](https://docs.qibb.com/__attachments/a_e283683466499c4f4bd63ae023ca7de651604f8f463846be66493daae90a2510/2023-10-30_17-51.png?cb=7edb0e087a1d3e73a4e6c5f3ff0cb84e)
Debug Messages View

Additionally, you can also use the three icons that appear on the right of the values to:

1. **Copy the path** - to copy the full path to this particular property key

2. **Copy the value** - to copy the value of this msg property

3. **Pin Open** - to highlight this particular value

![2023-10-30_17-55.png](https://docs.qibb.com/__attachments/a_bec09ca8df66e0d831d4273d0774454f9507c62b4a5d44152ec734e6e688bcb9/2023-10-30_17-55.png?cb=ba1b509d0d736ef973d0628a24958352)
Copy path 1️⃣ , copy value 2️⃣ and pin open 3️⃣ Scheduled Injection  
The second grouped node represents a small demo of the scheduled triggering of the flow.

At the bottom of every inject node you have a couple of options:

* **Inject once after (0.1) seconds** - a checkbox to ensure that the flow is triggered 100 ms after re-deployment or restart of the flow.

![2023-10-30_18-11.png](https://docs.qibb.com/__attachments/a_b96513aa523a39e5f738c7009ef74bf8885352fd7a1ad513b33c00d03baa12e3/2023-10-30_18-11.png?cb=97141005a023de6cffe825ec05647088)
Inject once after 10 senconds, then don't repeat  
It's important to note that you have the flexibility to modify and set a different delay value. The 0.1 values can be edited as soon as you select the checkbox.

This option can also be combined with the below scheduling options.

* **Repeat** - a dropdown with the following options:

  * **none** - self-explanatory

  * **interval** - you can set an interval in seconds, minutes, or hours after which the inject node would be re-triggered

![2023-10-30_18-13.png](https://docs.qibb.com/__attachments/a_6bb791ce7c5e37961a33e0db9e172ffd5aa26423d65fcaef331fd8804b8d039a/2023-10-30_18-13.png?cb=21d39af79fbabdbd0bc6d9d7b9ddda34)
Inject once after 10 seconds and repeat every 5 seconds

* **interval between times** - You can select an interval between specific hours of the selected days that the inject node would be triggered, e.g. trigger the inject node every 10 minutes between 18 and 19:00 on Monday till Friday

![Screenshot from 2023-10-30 18-15-26.png](https://docs.qibb.com/__attachments/a_ad76a0b7849c96192de8b15233842ac8ba77f3ab8007c43d7f487d6b6a64fd58/Screenshot%20from%202023-10-30%2018-15-26.png?cb=4527c5be702f05c2e451d035c6eb124c)
Never inject and repeat every 10 minutes **ONLY** between 18:00 and 19:00 on Monday till Friday

* **at a specific time**- set at what time and on which day the flow would be executed

![Screenshot from 2023-10-30 18-16-44.png](https://docs.qibb.com/__attachments/a_9f6b17bfa0bb22a831e9cc3e24e3d49ce64f0b9a30a1462b6781a8eb10bcd353/Screenshot%20from%202023-10-30%2018-16-44.png?cb=1ede514492e0b0a019e4f1403142f634)
Never inject and repeat from Monday till Friday at 17:30 sharp  
**Disabled Nodes**

The **Inject Every 5 Seconds** node is grayed out that means that it is disabled. You can re-enable it by double clicking on it and clicking on the bottom left **Disabled**button. Once re-enabled the node won't look grayed out anymore.

This functionality is present on almost every qibb flow editor nodes.  
![2023-10-30_18-28.png](https://docs.qibb.com/__attachments/a_cf2874a3e6dd43b9220b209a4ee8eb823005b9a165546d8865770b33a47d1221/2023-10-30_18-28.png?cb=c2f8f18f89ed356d0dca88740a7fb030)
How to Enable a Node

Node Status Visualization  
There are various methods to display status messages, and one of them involves utilizing the debug node. By selecting the last checkbox option, **node status (32 characters)** , you gain the ability to define the status message. It's important to note that the node status is **limited** to 32 characters, and any content beyond this limit will be automatically truncated.  
![2023-10-30_18-35.png](https://docs.qibb.com/__attachments/a_d2d1bb8f0917938fce00805051e0cea35b28e0df224de91617591145befced4a/2023-10-30_18-35.png?cb=781e26b2e4858a9524cde8f95e0ca353)
Node Status displaying the content of `msg.topic`

In the above case the content of `msg.topic` would be displayed under the debug node as shown in the screenshot below:  
![2023-10-30_18-36.png](https://docs.qibb.com/__attachments/a_fa2483608857ff8133b605cab88d23572d3b6f62687f2ce8818bf9d8f00816c1/2023-10-30_18-36.png?cb=fd925a9d1c498855962211cd8245bb4b)
Node Status Visualiasation Below The Debug Node Message Count Visualization  
In the following example, we demonstrate how to implement a message counter within a debug node. This feature ensures that each time a new message reaches the debug node, an internal counter increments by one, and the total message count is displayed beneath the debug node.

To enable this functionality, follow these steps:

1. Check the **node status** checkbox.

2. Select **Message Count** from the dropdown menu below, as illustrated in the screenshot below:

![2023-10-31_07-38.png](https://docs.qibb.com/__attachments/a_ca2a823f29b34b2b9d6f74fea868ffd830ab25c5052a41e6c2509f2588db8490/2023-10-31_07-38.png?cb=71f28374f8d87fb5cba4f96f94881188)
Debug Node with Message Count

This feature is particularly useful for visualizing the number of times a flow has been triggered or when it transitions to a specific branch.  
![2023-10-31_07-39.png](https://docs.qibb.com/__attachments/a_92a5fc3ab9fc6631c01e02578f7958c3b1a74c3a6e50b5e7fcdedfcf0de5b608/2023-10-31_07-39.png?cb=de2d60d429fd2b1948f0229cdad7683c)
Debug Node with Message Count JSONata Expression  
Many nodes within the qibb flow editor support [JSONata](https://jsonata.org/) expressions. In this particular example, the `msg.payload` has been configured to concatenate a string with the content of `msg.topic`.
JavaScript

    "Today's topic: " & "'" & topic & "'"

Keep in mind that when working with JSONata, if you intend to perform operations on certain properties of the `msg` object, you should omit the `msg.` prefix, as demonstrated in the code snippet above.  
![2023-10-31_07-41.png](https://docs.qibb.com/__attachments/a_44362bc8cf27af3d55a1b48ac5fadfb9ce153b230864bd6d7e3bc0dc64b9d6d4/2023-10-31_07-41.png?cb=950f7e323b5640619ebec118d677cece)
Debug Node with JSONata Expression

### Switch Node

The switch node is a versatile tool that enables conditional routing of messages based on user-defined rules, allowing for dynamic and flexible data flow within a flow-based programming environment, akin to the**if-elif-else**structure.  
The switch node evaluates conditions sequentially from top to bottom, and at the node's bottom left, you can customize its behavior and specify:

1. **checking all rules**, or

2. **stopping after first match**

![2023-10-31_07-47.png](https://docs.qibb.com/__attachments/a_0d15ed19f2a0028e870921ad8cc58e63cf8bdd914335b27103dc5f36ea0f4e44/2023-10-31_07-47.png?cb=91caee2e0b0db5ea3fe1001c0afb2b3c)
Switch Node Basic Configuration

The switch node offers a variety of pre-defined conditions and supports JSONata expressions. To introduce custom conditions, you can simply click the **Add** button 1️⃣, which will automatically create a new output 2️⃣ and associate it with the corresponding exit point 3️⃣ for matched conditions within the node.
Introduction to Switch Node  
In the initial example, we perform dual string comparisons against `msg.payload` (akin to **if** and **elif** conditions), directing the message to the corresponding output when a match is found; if none of the comparisons yield a positive result, the message is routed to the third output, simulating an **else** scenario.  
![2023-10-31_12-11.png](https://docs.qibb.com/__attachments/a_204a5cb73eac29bcb5ec66cf1496fa41c46d6093abe967ffe43faa1a1b6b703c/2023-10-31_12-11.png?cb=d8e2cd88092ac7db2e1309431425c1f7)
Switch Node Resembling **if-elif-else** Statement Switch Node Advanced  
In this example, various JSON objects, an array, a number, and a boolean are injected into a switch node, which evaluates the `msg.payload` for the presence of specific conditions, including whether the `msg.payload`:

1. Has a key called id

2. Has a key called "description"

3. Contains the string "news"

4. Value is between 10 and 200, or

5. Otherwise (if none of the above conditions are met)

Notably, the switch node is configured to assess all the defined rules (**checking all rules** ), allowing a single inject node to potentially route the `msg` object to multiple outputs simultaneously.  
![2023-10-31_12-13.png](https://docs.qibb.com/__attachments/a_cf83dd659eb5482f004499f5b12d58c6c47886b889b16b45f1cde239358c12e6/2023-10-31_12-13.png?cb=64aa09dc35943070eaa100bf35f43dd6)
Screenshot of the Switch Node With All Conditions

You can notice that if you trigger the first `inject` node (**Inject Object1** ) both the first and the second `debug` node will be shown in the debug messages tab.  
![2023-10-31_12-17.png](https://docs.qibb.com/__attachments/a_ca59361fedaa1e976c5d216de7dbbe0ec6d5607f71ba6d9e5fbd40414781bb17/2023-10-31_12-17.png?cb=c641bbab5c66148ffe454ee6bec51f8c)
Debug Output After Injecting Object1 Recreate Messages  
This example represents the most complex case within this section, employing the `split` and `join` nodes for advanced message handling.

First, an `inject` node inputs a `msg.payload` array into the flow, which comprises various data types such as numbers (both positive and negative), a string, and a boolean value.

Subsequently, the `split` node breaks up this array into its individual elements, resulting in the emission of multiple `msg.payload` messages, each containing precisely one element from the original array.

Following this, the switch node is configured to **check all rules** , and to **reconstruct the message sequence** based on three distinct checks whether the value of the `msg.payload`:

1. Is positive.

2. Is negative

3. Otherwise

![2023-10-31_12-20.png](https://docs.qibb.com/__attachments/a_0988d00d4fbfd45162abd95710cf124ce2b5193640f2bd751565e5bfff304c24/2023-10-31_12-20.png?cb=9702612698ed8d1e6ab708f70e6d05b9)
Switch Node Configuration

The subsequent `join` node is re-creating the array and the `debug` node is displaying the content of the modified `msg.payload` to the debug tab.

The settings on the `split` and `join` nodes are the default ones.

All three outputs would be triggered, but:

* The first one would contain an array containing ONLY the positive numbers

* The second one, all the negative numbers

* The third would display, every element of the initial injected `msg.payload`, that is not a number

![2023-10-31_12-19.png](https://docs.qibb.com/__attachments/a_af98e768dec8c53f26dabbfc3df71ef65be0bb731f0148aff5dae76159bf1904/2023-10-31_12-19.png?cb=12fa79c7e2076af6b41a862373f8c49c)
Debug Out

### Change Node

The change node can modify different properties of the msg object, by:

1. Set - creating/overwriting a new/existing msg property

2. Change - replace a part of an existing message property with a different one

3. Delete - deletes the specified message property

4. Move - move an existing message attribute to another key.

Introduction to Change Node  
In this example flow, we have used an `inject` node to set some attributes to the `msg` object and the change node, to modify those attributes.

The change node is configured to:

1. delete the `msg.deleteMe` property

2. move the `msg.odlMe` attribute to `msg.newMe`

3. set the `msg.payload` to the string: "qibb is awesome!". Note that the `msg.payload` attribute didn't exist in the injected `msg` object

4. change (find and replace) the string `world` with `qibb` in the `msg.topic`

![2023-10-31_12-23.png](https://docs.qibb.com/__attachments/a_c82e6515da932acd8c58b99d9881edaf73be2dfb1db0215822b4ced4ad8fc61d/2023-10-31_12-23.png?cb=b81bf6e0060ff4066190a201416932fd)
Change Node Configuration

And this is the debug out of this flow:  
![2023-10-31_12-23_1.png](https://docs.qibb.com/__attachments/a_a5dfab0eccb0bacc9517461f564d1e804567a733a4303a82c0a7c757a1c91071/2023-10-31_12-23_1.png?cb=be050baad9e3164021f4390813cead45)
Debug Out of Introduction of the Change Node Flow

Note down the content of the original and the final message is as shown in the screenshot above.

### Template Node

The template node is a powerful tool for creating dynamic and customizable content within your flows. It allows you to generate HTML, text, JSON, YAML, or other types of content by combining static text with data from incoming messages.

It supports the [Mustache](https://mustache.github.io/) templating engine, allowing you to create dynamic content. With Mustache, you can include placeholders in your templates, called **tags** , which are then replaced with actual data when the template is rendered. These tags are enclosed in double curly braces, such as `{{variable}}`. You can use these Mustache tags to reference `msg` properties and inject dynamic content into your templates.

You can set the output format of the template node to either:

* Plain Text

* JSON

* YAML

![2023-10-31_13-58.png](https://docs.qibb.com/__attachments/a_118781b7856c79e998bf7266b0ea443a31469d53a900cf5cebd5abd36f0e87c4/2023-10-31_13-58.png?cb=2cdcda2715d6d83c6e7dcff5af2e9ec9)
Template Node
Introduction to Template Node  
The first template flow shows very basic usage of the Mustache template language and the `{{payload}}` would be replaced with the content of `msg.payload` ("This is an introduction") and would be concatenated with the rest of the string `to qibb`.  
![2023-10-31_14-01.png](https://docs.qibb.com/__attachments/a_16e4bf8cdb59122131ce90bf1f7521da29c62d1d52cf69c35f45af008caa90ca/2023-10-31_14-01.png?cb=e854249f0efc55532effcb3751d2ed48)
Template Node Debug Output Advanced Template Usage  
In the second flow, we have more advanced use of Mustache templating to create a Plain text containing a list of fruits and their respective price.

The `msg.payload` is an array containing a couple of fruit objects:
JSON

    [
        {
            "name": "apple",
            "price": 100
        },
        {
            "name": "orange",
            "price": 80
        },
        {
            "name": "banana",
            "price": 210
        }
    ]

and the `msg.topic` is equal to the string "Fruits".

The template node is again set to the following Mustache template:
JavaScript

    # Price List of {{topic}}

    {{! outputs list of prices }}
    {{#payload}}
    - {{name}}: {{price}}
    {{/payload}}

The provided Mustache template is designed to generate a price list. Let's break down the elements of this template:

1. `Price List of {{topic}}`

   * This is a plain text line. It will be rendered as is in the output. The text "Price List of" is followed by `{{topic}}`, which is a Mustache variable. The value of the `msg.topic` variable will be dynamically inserted into this line when the template is rendered.

2. `{{! outputs list of prices }}`

   * This line is a Mustache comment. Comments in Mustache are enclosed within `{{! ... }}`. They are meant for documentation or explanatory purposes and do not affect the final output. In this case, it serves as a comment indicating the purpose of the following section.

3. `{{#payload}}`

   * This is the start of a Mustache section. It checks if the `payload` variable exists and is true. Since `msg.payload` is an array of objects of items, this section will iterate over each item in the list.

4. `- {{name}}: {{price}}`

   * This line is the template for each item within the `msg.payload` list. It uses Mustache tags to insert values from each item in the list:

     * `{{name}}`: This will be replaced with the "name" property of each item.

     * `{{price}}`: This will be replaced with the "price" property of each item.

   * The resulting output will be a list of names and their corresponding prices.

5. `{{/payload}}`

   * This is the closing tag for the `payload` section. It indicates the end of the section, and the template will stop iterating over the items in the `payload` list.

In summary, this Mustache template is used to generate a price list for a specific topic. It checks if there is a `payload` variable, and if it exists, it iterates over each item in the `payload` list, displaying the name and price for each item. The comments in the template provide additional context and are not part of the final output.

The output would be a plain text with the following content:

    Price List of Fruits

    - apple: 100
    - orange: 80
    - banana: 210

Parse JS Object with Mustache  
The last flow in this section would generate a JSON file out of a Mustache template.

The `msg.payload` is set to an array of objects each one containing keys and values:
JSON

    [
        {
            "key": "id",
            "value": "11341234"
        },
        {
            "key": "title",
            "value": "Test Title"
        },
        {
            "key": "description",
            "value": "Test Description"
        }
    ]

The Mustache template inside the `template` node is set to:
JavaScript

    { 
        {{#payload}}
            "{{key}}":"{{value}}",
        {{/payload}} 
    }

Things to note:

1. The entire template is enclosed within curly braces `{}` to create a JSON object.

2. Inside the `{{#payload}}` section, each `key` and `value` pair is enclosed in double quotes (`"`) to ensure they are treated as strings in the JS object.

3. A comma is added to separate each key-value pair within the JS object. However, we cannot remove the trailing comma at the last element, that is why we are using YAML output instead of JSON.

The resulting output will be a JS object with key-value pairs from the original `msg.payload` section and the resulting JS object would be:
JSON

    {
       "id":"11341234",
       "title":"Test Title",
       "description":"Test Description"
    }

### Function Node

The `function` node allows JavaScript code to be run against the `msg` object that is passed through it.  
**Function's Return Statement**

It is a convention to conclude your function nodes with the `return msg;` statement; without it, the flow will not seamlessly progress through the subsequent nodes. Returning a number or string will trigger an error.

Furthermore, the returned message object doesn't have to be identical to the one initially received; the function has the flexibility to create an entirely new object before returning it.
Introduction to Function Node  
In the first introduction to `function` node flow, the function node is receiving a Unix timestamp (milliseconds since the 1st of January 1970) and it is checking if this value is dividable evenly by 2:
JavaScript

    if (msg.payload % 2 === 0) {
        // Check if the current Linux Timestamp is odd or even
        msg.even = true;
        msg.odd = false;
        return [ msg, null ];
    } else {
        msg.even = false;
        msg.odd = true;
        return [ null, msg ];
    }

This `function` node code checks if the `msg.payload` contains an even or odd number and modifies the message accordingly. Here's an explanation of how it works:

* `if (msg.payload % 2 === 0)` - This line checks if the remainder of dividing `msg.payload` by 2 is equal to 0 using the [modulo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder) operator. In other words, it checks if `msg.payload` is an even number.

* If `msg.payload` is even:

  * `msg.even = true;` - It sets the even property in the msg object (`msg.even`) to true

  * `msg.odd = false;` - It sets the odd property to false to indicate that the payload is not odd

  * `return [msg, null];` - It returns an array with two elements. The first element is the modified `msg` object, and the second element is `null`. This means that the `msg` object would be passed to the **first** output of the `function` node and the second one would not be activated.

* If `msg.payload` is odd (not even):

  * `msg.even = false;` - It sets the even property in the msg object to false to indicate that the payload is not even.

  * `msg.odd = true;` - It sets the odd property to true to indicate that the payload is odd

  * `return [null, msg];` - It returns an array with two elements. The first element is `null`, and the second element is the modified `msg` object. This also means that the `msg` object would be passed to the **second** output of the `function` node only

![2023-10-31_16-08.png](https://docs.qibb.com/__attachments/a_ed9503ff98fc829461cac10d780b5db909e05684d0ca7cfa421fa8c5a509a5f4/2023-10-31_16-08.png?cb=b2e2b79a724af741e6975c6739522beb)
Debug Output of the Function Node  
Note here that instead of simply returning the `msg`, object, we return an array, containing of two elements, `null` and `msg`. You can create a `function` node no outputs or with more than one outputs.

`return [ null, msg ];` is a standard notation to activate the second output, which output would be activated is defined by the index of the `msg` object in the array.

You can also return the `msg` object to more than one output or simply `return null;` if you don't want your function node to have an output.  
![2023-10-31_16-10.png](https://docs.qibb.com/__attachments/a_93e24cb3c785bf18ce831c2c83a2affa5e88e57aab56fbd01943f8de3738a4d3/2023-10-31_16-10.png?cb=61f21b9caf6cee9448b554675ce57248)
Function Node with Two Outputs Setting Status  
Similar to the `debug` node, the `function` node can also display status, but you can extend this functionality by defining the

* The `shape` property can be: `ring` or `dot`.

* The `fill` property can be: `red`, `green`, `yellow`, `blue`, or `grey`

* The `text` - the text that would be displayed as a status message

JavaScript

    // calling node.status show status information below the function node
    switch (msg.payload) {
        case "red":
            node.status({fill:"red",shape:"dot",text:"disconnected"});
            break;
        case "green":
            node.status({fill:"green",shape:"ring",text:"connected"});
            break;
        case "text":
            node.status({text:"Just text status"});
            break;
        case "clear":
            node.status({});   // to clear the status    
            break;
    }

This code evaluates the value of the `msg.payload` to determine which case to execute.

* The first case would set the status of the node to "disconnected" and use a red dot:

![Screenshot from 2023-10-31 16-23-15.png](https://docs.qibb.com/__attachments/a_6e4b55286252fc13437565a6a18628105dc8d9ff697fe25a6c4c9d53bec1a3ac/Screenshot%20from%202023-10-31%2016-23-15.png?cb=db753a74a7dca749606ccee7c4f36513)
Disconnected Status

* The second case would set it to green ring and the status would be connected:

![Screenshot from 2023-10-31 16-24-31.png](https://docs.qibb.com/__attachments/a_b5f44ca5bdf8702d76a2f045841dfa5792609cd3549992a73711539f5dc3632e/Screenshot%20from%202023-10-31%2016-24-31.png?cb=990ea826ac9ef4011b05600d8bb20083)
Connected Status

* The third case to text only:

![Screenshot from 2023-10-31 16-25-15.png](https://docs.qibb.com/__attachments/a_49a2d5f0c11ca3d33710b7f31fb75ad926c2e27474defb6ee6305620268f5522/Screenshot%20from%202023-10-31%2016-25-15.png?cb=60d16ba04ee10d6b342ac611a32bed7c)
Text Status

* The last one to clear, no status message text.

Sending Multiple Messages  
In the "Sending Multiple Messages" flow we are setting up four different `msg` objects and we are returning the first three to the first output and the last one to the second output.

This means that you would see four debug messages `return [ [ msg1, msg2, msg3 ], msg4 ];`

1. Three from the first debug node `[ msg1, msg2, msg3 ]`

2. One from the second debug node `msg4`

In the code execution field, we set each `msg` object to a respective JSON object, containing only one payload property:
JavaScript

    // returning array of message send elements to output ports
    let msg1 = {
        payload: "first out of output 1" 
        };

    let msg2 = {
        payload: { 
                    "id": "696a05b1-c4e0-403d-b72e-31149015f887", 
                    "title": "Test Title"
                } 
        };

    let msg3 = {
        payload: [ 
                    "sport", 
                    "news", 
                    "entertainment"
                ]
        };

    let msg4 = {
        payload: "only message from output 2"
        };

    // Returns message objects
    return [ [ msg1, msg2, msg3 ], msg4 ];

This is the parsed output of the node:  
![2023-10-31_16-37.png](https://docs.qibb.com/__attachments/a_64211ee6cfd8c0d46ac6374dcdf46d9e1b7cb0db7ddd82d6764bd344d0af455d/2023-10-31_16-37.png?cb=8876b39b292df9ce68705a9ef61ef760)
Parsed Debug Output Sending Messages Asynchronously  
You can use the `node.send()` function to return the message object pre-maturely and continue the execution of the `function` node code. This way, you can send messages asynchronously inside a `function` node.

For example:
JavaScript

    for ( let i = 0; i < 10; i++ ) {
        if ( i % 2 === 0 ) {
            msg.payload = i;
            node.send(msg);
        }
    }

    msg.payload = "Done!"
    return msg;

In this for loop, we send the `msg` object on every iteration if the `count` is evenly divided by 2, and we assign the `msg.payload` to the `count` variable.

After we are done with the loop the `msg.payload` is assigned to the string `Done` and the `msg` object is once again returned.  
The difference between `node.send(msg);` and `return msg;` is that after `node.send()` the rest of the code in the function node, continues to be evaluated, while if using the `return` statement, the rest of the code is being ignored.  
![2023-10-31_17-31.png](https://docs.qibb.com/__attachments/a_b8643653fdf329194dd0d2145c2cd6e61be86267485094980a98b401df95097c/2023-10-31_17-31.png?cb=0f9bdf67d5c009a802806e7557ef8181)
Debug Out of the Async Flow Errors Handling  
In the qibb flow editor, you have the capability to trigger errors using the `node.error()` statement. This feature can be effectively combined with a `catch` node, which can monitor one or multiple nodes for errors and, upon detection, retrieve and return those errors.

This is the content of the `function` node:
JavaScript

    // In function node, calling node.error functions with the original input message as its second argument triggers catch node
    // See debug sidebar and console output
    node.error("Oh no, something bad happened", msg);
    // execution should stops here
    return null;

Here we simply raise an error with the following text: "Oh no, something bad happened" and this error would be caught by the `catch` node.  
![2023-10-31_17-35.png](https://docs.qibb.com/__attachments/a_4f12d98729e4b210836b8aa4e27b2e8c377e940bd830879d658c2221412b6698/2023-10-31_17-35.png?cb=e0a9169cc8a97603346a71fb15109617)
Catch Node Configuration

The screenshot above displays the configuration of the `catch` node, which in this case is configured only to monitor the function node with a name: **report error**.

As you can notice the `function` node doesn't have an output, but you can still see the error in the `debug` node, connected after the `catch` node:  
![2023-10-31_17-40.png](https://docs.qibb.com/__attachments/a_fd0f7d27a32b0fb5b29a6f061929817b3611c5beeada2aa4a22c7bc690439e76/2023-10-31_17-40.png?cb=1b76b01b8cc4e798ac00b9cd4b048ea6)
Catch Node Output

Please note the format of the `error` message object:
JSON

    {
       "_msgid":"692f7e3950d5ee2c",
       "error":{
          "message":"Oh no, something bad happened",
          "source":{
             "id":"1bcca7af.619428",
             "type":"function",
             "name":"report error",
             "count":1
          }
       }

Here you have information about the error message and the node source that generated it. As you can see the source, outlines the node ID, node type, node name, and the count of the error messages. The function ID can also be checked in the **Information** tab:  
![2023-10-31_17-44.png](https://docs.qibb.com/__attachments/a_bef7181a5a55f34d7b98f5fe50c5e88a2a8d5471297573a2f422bc37a61a6aa3/2023-10-31_17-44.png?cb=a439688caaecf903bdba1ee823768a0a)
Function Node ID Import External Modules  
The last flow in this tab shows you how to import external `node.js` modules.

First, you need to click on the **Add** button 1️⃣, then define the modules in the `function` node **Setup**tab 2️⃣ and define how you want to refer to them 3️⃣.  
![2023-10-31_17-49.png](https://docs.qibb.com/__attachments/a_f88883a5614782896be7b2bf273cca16c9ffd146ddf374e61837f92acf599b26/2023-10-31_17-49.png?cb=5aebae2a8cbce49c3ccb8dfc510fe45e)
Importing The UUID Node.js Module

In this example, we import the [UUID](https://www.npmjs.com/package/uuid) `node.js` module and we import it as `uuid`.  
**What is UUID?**

UUID stands for "Universally Unique Identifier." It is a 128-bit identifier that is guaranteed to be unique across both space and time. UUIDs are often used in software and systems to uniquely identify resources or entities, such as documents, objects, or records. They are designed to be unique, even when generated in different locations and at different times, making them suitable for distributed systems.

UUIDs come in several versions, each with a different algorithm for generating the identifier. The most commonly used versions are:

1. **UUID version 1 (UUIDv1)**: Generated based on the host's MAC address and the current timestamp. It provides a relatively unique identifier that also encodes the time of creation.

2. **UUID version 4 (UUIDv4)**: Generated using random data. This version is often used when uniqueness is more critical than encoding time information.

UUIDs are represented as 32 hexadecimal digits separated by hyphens (e.g., `550e8400-e29b-41d4-a716-446655440000`) and are typically used in various software applications, databases, and distributed systems to ensure the uniqueness of entities and avoid conflicts when different parts of a system generate identifiers.

In the function node, we define:
JavaScript

    // Creating two variables and assigning to them UUIDs v.1 and v.4
    const uuidV4 = uuid.v4();
    const uuidV1 = uuid.v1();

    // Printing in the debug messages tab the generated UUIDs
    node.warn(`UUID v.1 generated using the UUID external module: ${uuidV1}`);
    node.warn(`UUID v.4 generated using the UUID external module: ${uuidV4}`);

    // When a Null value is returned, it serves as a flow-stopping mechanism, 
    // ensuring that no further actions are triggered beyond the scope of this function. 
    // This behavior guarantees the containment of any downstream processes.
    return null;

We are using the external [UUID](https://www.npmjs.com/package/uuid) `node.js` module to generate two UUIDs:

1. `uuidV1` - version 1 UUID

2. `uuidV4` - version 4 UUID

The `node.warn()` statement is logging messages to the debug tab. The [template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) are used as string interpolation to create the warning message that would be passed to the debug node.  
**Template Literals**

The backtick character**\`\`** in JavaScript is used to create template literals.

These literals can be used for:

* **String interpolation** - You can embed variables and expressions within a template literal using \`${}\`

* **Multi-line Strings** - Template literals allow you to create multi-line strings without the need for escaping line breaks or using concatenation.

* **Expression Evaluation** - You can include expressions and functions within template literals, and they will be evaluated

* **Tagged Templates** - Template literals can be used with a tagging function to customize the behavior of string interpolation. This is a more advanced usage, often used in libraries for creating custom string processing functions.

![2023-10-31_18-04.png](https://docs.qibb.com/__attachments/a_12245cafa6eca6c72105759f3308a993c269e28ebe2f4d85019c4d87cd49b9c8/2023-10-31_18-04.png?cb=3b7d173b1027452656dab2aed36758b9)
UUID v1 and UUID v4

---
language: "en"
---
# Baton

## Introduction

Interra Systems' **BATON** is a leading M/L and AI automated QC platform for VOD content, ensuring quality and compliance for linear and streaming workflows. This hybrid solution combines automated and manual checks, enhancing broadcast workflows seamlessly. **BATON** is favored by global broadcast, cable, telco, satellite, IPTV, OTT, and post-production markets, along with archiving companies. It remains the top choice for file-based QC needs, available on-premise and in the cloud.

You can find more details and the supported operations on [Baton \| qibb Catalog](https://www.qibb.com/integrations/baton/).

## How to get started with Baton integration

Before you get started using **Baton**integration please make sure that you have the needed permission for the operations.

To integrate **BATON**with your workflow, follow these steps:

1. Ensure you have your **Username, Password, and BATON Host** for authentication.

2. Open the qibb **Workflow Editor** and navigate to the **Node Catalog** in the right sidebar.

3. Install the **BATON** node by clicking on the **+** button.

4. Drag and drop the **BATON API** node and any other nodes you need from the left sidebar and place them in your flow.

5. Enter your **Username** and **Password** in the node's **Connection** settings (first dropdown), and enter the **BATON Host** in the node's **Host** field. Alternatively, you can use the **Auth and Host Config** function node included in the example flow to configure these values once and reuse them. After completing these steps, you can start using the integration.

   ![image-20251229-094127.png](https://docs.qibb.com/__attachments/a_a2ccbbb13cb5bcbd81118cb6b56c56950a5df82dfb96684cd718d88c1b7fc702/image-20251229-094127.png?cb=3b26ef6b56ea837b7b0ebdfd727ef129)

BATON is a software solution so it should be installed in a physical server or deployed in a cloud service such as AWS.

## Importing flow examples of a node

Once you've successfully [installed a node from the qibb catalog](https://docs.qibb.com/platform/latest/Using-the-qibb-Node-Catalog-plugin.66894168318.html), you can easily import example flows that showcase how the nodes can be used. These example flows are directly accessible within the Flow Editor and are designed to guide users with helpful hints, including how to configure mandatory parameters and credentials.

Here's how to import examples:

1. In the top right corner of the Flow Editor, click on the **menu** icon.

2. Select **Import** to open the Import Dialog.

3. Click on the **Examples** tab.

4. Choose an example from the list.

5. Confirm your selection by clicking on the **Import** button.

By following these steps, you are now ready to make basic API calls using the provided examples. For further exploration of what's possible, you can find more complex examples in the [Flow Catalog.](https://docs.qibb.com/platform/browsing-flows.md)

[Next Page](https://docs.qibb.com/llms-full.txt/1)
