Only this pageAll pages
Powered by GitBook
1 of 61

ByteNite Docs

Getting Started

Loading...

Loading...

Loading...

Examples

Loading...

Loading...

CREATE WITH BYTENITE

Loading...

Loading...

Loading...

Loading...

Loading...

Launch with ByteNite

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

API Reference

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

GUI

Loading...

Other

Loading...

Loading...

Tutorials

Welcome! We have cooked up a few tutorials to help you get started on ByteNite.

Introduction

Explore ByteNite Docs to learn how to build, deploy, and run distributed apps—from quick scripts to complex pipelines—at cloud scale.

ByteNite’s serverless container platform is built for high-performance teams and developers who need fast startup times, flexible compute, and a simpler path to getting things done—without the headaches of traditional cloud infrastructure.

But we don’t just host containers. We’ve designed a distributed execution fabric that eliminates cold starts, streamlines app architecture, and gives you full control over your container environments—without the overhead of managing infrastructure.

With ByteNite, you can focus on building your app and leave the heavy lifting to us:

  • Write your core application and fan-out/fan-in logic in the programming language you know best.

  • Package your dependencies using any public or private Docker container image.

  • Define environments and hardware specs with a lightweight manifest file.

  • Submit jobs that are automatically partitioned, scheduled, and executed across pre-warmed cloud runners—powered by our proprietary distributed execution fabric.

Ready to dive in? This documentation site covers everything you need, from getting started to scaling complex workloads.

Documentation overview

Our docs are here to guide you—from first steps to advanced workloads. Whether you’re exploring tutorials, learning about core system components, or diving into API references, you’ll find everything you need to build, manage, and scale apps on ByteNite.

Just checking things out?

If you’re unsure whether ByteNite is the right fit for you or your team, start with our guide or read our tutorials—no account needed!

1. Understanding the workflow

We’ve broken down distributed computing into a few key components to make building and managing apps simpler. To get started, check out our guide, where you’ll dive into the typical processing job's lifecycle and get an overview of each stage, learning example use cases across different data types.

Here’s a quick rundown of a typical setup:

  • Partitioner – Pre-processes and splits your input data into manageable chunks.

  • App – Runs the core logic and handles the heavy lifting of your workload.

  • Assembler – Merges or cleans up the output once processing is complete.

2. Checking out tutorials

If you’re new to ByteNite, a great place to start is with our tutorials. They walk you through real examples, so you can get hands-on experience and see how everything fits together.

While it’s tempting to jump straight into building your own applications, we recommend browsing the full system guides first. They’ll help you understand the bigger picture and the components that power ByteNite.

3. Taking the next steps: build and launch your apps

Once you’re comfortable with how ByteNite works, the next step is diving into the guides that help you build, launch, and manage your apps effectively.

You’ll learn how to structure your workloads using ByteNite’s modular components, connect your data sources, and run distributed jobs. After that, you’ll explore the API that ties everything together—allowing you to automate job launches, manage secrets, access logs, and more.

Head over to the guides below to get the full rundown:


Product & services

ByteNite’s serverless computing platform offers APIs and interfaces designed to make app development and workload management smoother at every stage.

As a ByteNite user, you have access to all our services, fully documented right here.

Below, you’ll find our user-facing components, grouped into:

  • UIs – For interacting with your apps, monitoring jobs, and managing configurations.

  • APIs – For programmatic access to launch jobs, manage data, and integrate with your workflows.

UIs

APIs

How it Works

Job lifecycle: an overview of ByteNite's end-to-end workflow

At ByteNite, a typical job follows this lifecycle:

  1. Launch Phase: The customer initiates a job via the ByteNite API, specifying the data source and configuration details. The system pulls data from various cloud storage services (AWS S3, GCP, Azure, etc.).

  2. Create Phase: This encompasses three stages:

Partitioner: The partitioner ingests the raw data, pre-processes it if necessary, and fans it out into independent chunks for parallel execution.
  • App: Each chunk is processed independently by the user-defined App, running the core logic (e.g., AI inference, media transcoding, data transformation).

  • Assembler: The assembler collects the results from each parallel execution, performs optional post-processing, and generates the final output.

  • Launch Phase (continued): Once the job completes, the assembled output is written back to the designated data destination (cloud storage), and the job status is finalized.

  • This modular flow ensures scalability, fault tolerance, and flexibility, letting you focus on building impactful applications without worrying about the underlying infrastructure.


    📦 Data pre-processing and task fan-out

    Many applications require a pre-processing step to clean, filter, or split data into manageable chunks before core processing. ByteNite’s Partitioning Engine handles this pre-processing and task fan-out, distributing your workload across multiple parallel workers.

    Whether you’re working with structured tables, unstructured media files, or semi-structured logs, ByteNite’s partitioners support a variety of fan-out strategies.

    Examples of task fan-out use cases

    Data Type
    Partitioning Engine Examples

    Structured Data

    - Sharding by row/item count - Sharding by date range or key

    Semi-Structured Data

    - Key extraction and object fan-out - Log file splitting by timestamp

    Unstructured Data

    Text/Code - Document splitting by section or size - Codebase sharding by file/module Image - Image tiling - Batch splitting for inference Audio - Time-based audio chunking - Silence detection-based chunking - Language segment splitting Video - Frame-based video chunking - Scene detection-based chunking - Resolution-specific splitting

    Any

    - Task replication for redundancy - Passthrough (no fan-out)

    If your workflow doesn’t require splitting data into tasks, you can use a passthrough partitioner to skip the fan-out phase.


    🧠 Core Task Execution

    The App represents the core logic of your distributed job—this is where the heavy lifting happens. Whether it’s AI inference, media rendering, data transformation, or scientific computation, Apps execute these workloads in parallel across the data chunks produced by the partitioner.

    You bring your container image with the necessary code and dependencies; ByteNite handles the rest: container orchestration, retries, scaling, and resource management.

    Examples of core processing use cases

    Category
    Example Workloads

    AI/ML

    - Model inference (e.g., object detection, language models) - Model training on distributed datasets - Feature extraction pipelines

    Data Processing

    - ETL (Extract, Transform, Load) operations - Batch processing of logs or events - Data anonymization or sanitization

    Media Processing

    - Audio transcription - Image classification or enhancement - Video transcoding or thumbnail generation

    Scientific Computing

    - Genomic sequence analysis - Simulation workloads - Complex mathematical computations

    Other

    - Web scraping at scale - Document parsing and conversion - File format conversions


    📥 Task Fan-In and Data Post-Processing

    After core processing, results from each task may need to be collected and aggregated. The Assembling Engine performs this fan-in and post-processing, allowing you to organize or transform the results before outputting them to the final destination.

    This stage can be as simple as zipping files together or as complex as reassembling a video stream.

    Examples of task fan-in use cases

    Data Type
    Assembling Engine Examples

    Structured Data

    - Data merging based on keys - Sorted concatenation of CSV/JSON files

    Semi-Structured Data

    - Log file aggregation - Schema validation and merging

    Unstructured Data

    Text/Code - Document stitching (e.g., combining chapters) - Codebase reassembly Image - Batch packaging of images - Mosaic creation from tiles Audio - Concatenation of audio chunks - Index-based reassembly Video - Video stream stitching - Scene-ordered assembly of clips

    Any

    - File zipping - Passthrough (no fan-in)

    If no post-processing is required, a passthrough assembler can output task results directly.

    Hello World

    Build a simple "Hello, World" app on ByteNite.

    Image Generation

    Run a distributed image generation job using Pytorch and Diffusers on ByteNite.

    LLM Serving

    Serve a quantized 17B Llama 4 Scout model using llama-cpp-python on ByteNite.

    Web Scraping

    Scrape Amazon product data at scale using Playwright, extracting titles, prices, and buyer counts on ByteNite.

    👋Hello, World!
    https://github.com/ByteNite2/img-gen-diffusers
    https://github.com/ByteNite2/llm-serving
    https://github.com/ByteNite2/web-scraper
    Cover
    Cover
    Cover
    Cover
    How it Works
    How it Works
    Cover

    Get a step-by-step overview of ByteNite’s distributed job lifecycle and see how your workloads run at scale.

    Cover

    Get started with code examples. Read, learn, replicate.

    Cover

    Explore ByteNite's Building Blocks, our modular software components designed to run your code on our distributed infrastructure.

    Cover

    Learn about our supported storage integrations, and connect your data source to ByteNite.

    Cover

    Link template, data sources, and parameters to a job API request and run your app!

    Cover

    Learn commands that let you build and submit apps to our system.

    Cover

    Launch jobs and manage settings, including billing and usage from a handy web platform.

    Cover

    Configure and run jobs, manage data sources, templates, and schemas.

    Cover

    Get credentials, store secrets, and authenticate your requests.

    Cover

    List and manage your apps and data engines. Powers the Dev CLI.

    Cover

    See your transaction history, monitor your usage and current balance.

    Building Blocks

    Overview of ByteNite's core components and functionalities

    ByteNite's building blocks are designed to help you structure your distributed workloads into modular, reusable components. These components—Partitioners, Apps, and Assemblers—let you focus on your core logic without worrying about the complexities of distributed execution, fault tolerance, retries, or logging. We've got that covered.

    At a high level, ByteNite breaks down a distributed job's lifecycle into three phases:

    1. Partitioning Engine: Handles input downloading, pre-processing, and task creation.

    2. App: Executes the core logic for each individual task.

    3. Assembling Engine: Collects and merges the results from individual tasks.

    Each component is fully customizable and versionable, enabling you to build flexible pipelines that fit your specific needs.

    Explore the following guides to learn how to develop your own ByteNite Apps, Partitioning Engines, and Assembling Engines to create distributed workflows tailored to your needs.

    Manage




    Cover

    Apps let you submit code to run on ByteNite's infrastructure.

    Cover

    Build a Data Partitioning Engine to tell your app how to pre-process input data.

    Cover

    Add a Data Assembling Engine to define chunk merging logic.

    Cover

    Use Job Templates to harmonize versions across apps and data engines.

    Onboarding

    Get all you need to begin running workloads on ByteNite and doing some Byte-magic!


    👤 Create an account

    1. Get an access code Currently, our platform is in beta and you'll need an access code to create an account. If you have one, use it when required during the sign-up process. Otherwise, you can Request an Access Code.

    2. Sign up on Computing Platform To create an account on ByteNite, follow this link and fill out the form with your contact info and your access code: .


    💳 Add a payment method

    Having an account is sufficient for creating apps and start playing around with ByteNite. However, once your credits are over you’ll need an active billing account to keep launching jobs. Follow the steps below to add a payment method to your account and activate it.

    1. Access your Billing page After registering and logging in, go to or navigate to the Billing page on the sidebar.

    2. Add a payment method Locate the Payment Info card an navigate to the Customer Portal. Follow the steps to add a payment method to your account.

    NOTE: Your payment information will be stored for manual top-ups as well as automatic top-ups triggered by the end of the current billing cycle. Make sure you have enough funds to cover your previous billing cycle's costs to avoid service interruptions.


    🪙 Redeem ByteChips

    If you have a coupon, you can redeem it on your billing page to add ByteChips to your balance.

    1. Access your Billing page: After registering and logging in, go to or navigate to the Billing page on the sidebar.

    • Redeem a coupon: Go to the Account Balance card and click on "Redeem". Enter your coupon code in the corresponding field and complete the process. Ensure the amount has been added to your balance; refresh the page if needed.

    We'd love to get you started with free credits to test our platform. If you haven't received free ByteChips upon signing up, and we'll grant you some.


    🔐 Get an API key

    For programmatic access to our API, you'll need an API key linked to your account. You can have multiple keys, each meant for a specific integration. Follow these steps to get a key:

    1. Access your profile After registering and logging in, go to or click on your profile avatar located in the top right corner of the webpage.

    2. Create a new API key On your profile page, locate and click the 'New API Key' button or link.

    3. Configure your API key settings Provide a descriptive name for your API key, choose its validity duration, and enter the confirmation code sent to your email. After filling out the necessary details, click the 'Generate API Key' button.

    One-time API key access

    Please note that for security reasons your API key will only be visible and copyable right after you've generated it. Be sure to copy and securely store it immediately.

    Note: The "key ID" is merely an identifier and differs from the actual key.

    1. Managing your API keys If your key is no longer needed or is compromised, return to the API section in your profile. Find the key and click 'Revoke' to invalidate it.


    🔑 Get an access token

    An access token is required to authenticate all requests to the ByteNite API, except for OTP and access token requests.

    To request an access token, send a request to the endpoint using your API key.

    Access tokens have a default duration of 3600 seconds (i.e., 1 hour). Once expired, you must request a new one.


    🛠️ Set up development tools

    Here are some recommended tools to get started with ByteNite's.

    1. Download & set up ByteNite Dev CLI:

    1. Set up ByteNite API:

    Create a Postman collection from ByteNite's OAS

    Postman is a popular API development tool that simplifies API testing, debugging, and collaboration. It allows developers to organize API requests into collections for easy management and execution. With Postman, you can quickly import ByteNite's OpenAPI Specifications (OAS), generate pre-formatted API requests, and start interacting with our APIs without the need to write code.

    Below is a setp-by-step guide to set up Postman and load ByteNite's API specification:

    1. Launch Postman Download on your device or access the web app from your browser. Create a free account and log in to start using the platform.

    Developer API

    About

    • Base URL: https://api.bytenite.com/v1/dev

    • Version: v1

    • Swagger Docs:

    • Specification:


    Manage



    Temporary Bucket

    With ByteNite, you can save your output files to a temporary storage location on Google Cloud at no additional cost.

    This temporary bucket is intended for short-term use and is automatically managed to ensure file security and accessibility. ByteNite generates a temporary authenticated direct access URL for each output file or folder, simplifying access to your results.

    Files remain available for 48 hours after being saved in the temporary storage, after which they are permanently deleted. This setup is perfect for workflows requiring short-term file storage without ongoing management.

    The temporary storage bucket is exclusively a data destination, designed for saving output files from your jobs. It cannot be used as a data origin for sourcing input files.

    Apps

    Metadata




    Events


    Update




    Data Sources


    Read




    Templates


    Templates




    Pull


    Secrets




    Push


    Create


    Metadata

    Fetch app's metadata like name and version.

    Push

    Push a local app directory to ByteNite.

    Manage

    Activate, deactivate, and delete apps.

    Pull

    Download a ByteNite app locally.

    Temporary Bucket Data Source Object

    dataSourceDescriptor : bucket

    To set up a temporary bucket data destination, provide the following simple dataSource object in your API request (no params expected):

    POST /customer/jobs/{jobId}/datasource
    {
      "dataSource": {
        "dataSourceDescriptor": "bucket",
      }
    }
    Copy your API key Once generated, immediately copy your API key and securely store it. Treat your API key with the same security precautions as a password.

    Import ByteNite's OpenAPI Specification

    • Click the "Import" button at the top-left corner of the Postman interface.

    • In the Import modal, switch to the "Link" tab.

    • Paste one of ByteNite's Swagger JSON links into the URL field:

      • Jobs API:

      • Auth API:

      • Dev API:

    • Click "Continue".

  • Confirm and Create the Collection

    • Postman will analyze the Swagger JSON and prompt you to confirm the import.

    • Ensure one of the options "Postman Collection" or "OpenAPI 2.0 with a Postman Collection" are selected.

    • Click "Import" to generate the collection.

    • Repeat for each Swagger JSON file.

  • Review the Imported Collection

    • Navigate to the Collections tab in Postman.

    • Locate the newly created collections (ByteNite jobs API, ByteNite auth API, ByteNite dev API).

    • Expand the collection to see the organized endpoints and methods.

  • Configure Environment Variables (Optional) Environment variables in Postman are useful for storing values like API keys, names, and IDs that you frequently use in your requests. By using environment variables, you can manage these values centrally and reuse them across multiple requests.

  • Test the API

    • Select an endpoint from the collection.

    • Add the necessary headers, body, or parameters as specified in ByteNite's documentation.

    • Click "Send" to execute the request and view the response.

    • That’s it! You’ve successfully set up ByteNite’s API collections in Postman.

  • Additional Tips

    • Authentication: ByteNite APIs require authentication (Bearer tokens). Set up the required auth details under the Authorization tab for the collection or individual requests.

    • Collaboration: Share the imported collection with your team by clicking "Share Collection".

    • Documentation: Use Postman’s Documentation feature to add notes or examples to requests for easy reference.

    Sign Up for ByteNite
    https://app.bytenite.com/billing
    https://app.bytenite.com/billing
    send us a message,
    https://app.bytenite.com/profile
    Developer CLI
    Postman
    How it Works
    Access Token



    https://api.bytenite.com/v1/dev/docs/
    https://api.bytenite.com/v1/dev/docs/swagger.json

    Other




    Logs


    Pull


    Redeem Coupon


    Exchange Rate


    Manage



    Wallet API

    About

    • Base URL: https://api.bytenite.com/v1/wallet

    • Version: v1

    • Swagger Docs:

    • Specification:

    Push


    User



    Transactions




    API Keys

    Learn how to create API keys:

    • 🔐 Get an API key



    Hello, World!

    The goal of this tutorial is to build a simple ByteNite app that outputs the string "Hello, World!" to a file. Use this tutorial if you're new to ByteNite and want to have a quick sense of the workflow.

    Duration
    Difficulty
    Prerequisites


    1

    File Upload

    Uploading input files directly from your computer makes it convenient to process local content for tests.

    We require a 4-step process for uploading local files, which involves configuring a data source, retrieving a temporary upload URL, uploading the file, and notifying the server upon completion.

    1

    Set Local File Data Source Object

    Metadata




    HTTP

    Introduction

    You can fetch files directly from a public URL pointing to the raw resource, which is especially useful for utilizing temporary access URLs generated by cloud storage providers not integrated with ByteNite.

    Keep in mind that an HTTP source serves solely as a data origin, meaning it cannot be used as a data destination. This ensures that data fetched via HTTP can be read and processed, but not directly modified or uploaded back through this method.

    Changelog

    Track updates, improvements, and fixes across each release of the platform.

    Release Notes – October 6, 2025

    ✨ New Features

    • Added support for secret type “other”, expanding secret management capabilities.

    Balance


    Access Token

    In order to authorize your API calls, you will need an access token. For security, the only way to programmatically obtain an access token is by exchanging it for an API key. Learn how to:


    Jobs

    Authentication API

    About

    • Base URL: https://api.bytenite.com/v1/auth

    • Version: v1

    Enabled automatic injection of secrets into apps and engines, allowing access through environment variables.


    Release Notes – September 19, 2025

    ✨ New Features

    • Introduced entity delete APIs for streamlined data management.

    • Added Server-Sent Events (SSE) for real-time task status updates in the backend.

    ⚡ Improvements

    • Renamed secrets and dataSourceDescriptor references from S3 to AWS for consistency across services.


    Release Notes – September 12, 2025

    ⚡ Improvements

    • Updated backend API routing from v1/customer/ → v1/computing/, preparing for the deprecation of older endpoints.

    • Populated the username field for existing user records to improve identity consistency.

    🐞 Fixes

    • Resolved issues related to template and engine import operations.

    🗑️ Deprecations

    • Marked the /customer/stats endpoint as deprecated in favor of updated computing metrics APIs.


    Release Notes – September 3, 2025

    ✨ New Features

    Implemented a shared cache directory on GCS for worker VMs, allowing apps to access cached data via predefined environment variables.


    Release Notes – August 29, 2025

    ✨ New Features

    • Introduced APIs/CLI commands for publishing and unpublishing apps, engines, and templates

    • Added public entity import functionality through both API and CLI commands

    • Added new API endpoints for browsing and uploading cache

    • Added support for username creation

    ⚡ Improvements

    • Improved task assignment to ensure correct distribution across CPU and GPU devices

    🐞 Fixes

    • Fixed issues with validating data sources and destinations in templates

    🗑️ Deprecations

    • Removed support for stale tasks

    • Deprecated job presets and schemas


    Release Notes – August 21, 2025

    ✨ New Features

    • Added onboarding prompt displayed on first login to the computing UI platform

    ⚡ Improvements

    • Restructured jobs and templates table

    • Enabled job creation from either a template or from scratch

    https://api.bytenite.com/v1/customer/docs/swagger.json
    https://api.bytenite.com/v1/auth/docs/swagger.json
    https://api.bytenite.com/v1/dev/docs/swagger.json
    https://api.bytenite.com/v1/wallet/docs/
    https://api.bytenite.com/v1/wallet/docs/swagger.json

    Create

    Post a new job.

    Read

    Get a job's details, list and filter jobs.

    Update

    Set a job's data source, parameters, and name.

    Manage

    Run, abort, and delete jobs.

    Engines

    dataSourceDescriptor: file

    @type:type.googleapis.com/bytenite.data_source.LocalFileDataSource

    When setting up a data source, use the following dataSource object to begin the local upload workflow:

    2

    Retrieve a Temporary URL

    After submitting the data source, fetch the generated temporary URL from the job's API response:

    3

    Upload a File

    Upload your local file to the temp URL previously fetched using a PUT request:

    4

    Notify Server of Successful Upload

    Let the server know that your upload is ready via the "Upload Completed" endpoint.

    This notification ends the workflow, linking the uploaded file to your job.

    HTTP Data Source Object

    dataSourceDescriptor : url

    @type : type.googleapis.com/bytenite.data_source.HttpDataSource

    To configure your HTTP data source, specify a valid URL pointing to the raw resource in your dataSource object, as in the following example:

    POST /customer/jobs/{jobId}/datasource
    {
      "dataSource": {
        "dataSourceDescriptor": "url",
        "params": {
          "@type": "type.googleapis.com/bytenite.data_source.HttpDataSource", 
          "url": "https://storage.googleapis.com/video-test-public/input/bbb.mp4"
        }
      }
    }
    temp_url = job_response.json()['job']['dataSource']['params']['tempUrl']
    my_file = '/local/path/to/my/file.obj'
    
    with open(my_file, mode='rb') as f:
        requests.put(temp_url, data=f, headers={'Content-Disposition': 'attachment'})
    response = requests.post(f'http://api.bytenite.com/v1/customer/jobs/uploadcompleted/{job_id}',
                                      json={}, headers={'Authorization': access_token})
    POST /customer/jobs/{jobId}/datasource
    {
      "dataSource": {
        "dataSourceDescriptor": "file",
        "params": {
          "@type": "type.googleapis.com/bytenite.data_source.LocalFileDataSource"
        }
      }
    }

    Download sample app

    Run the app new command in your terminal to create an app directory locally named "hello-world":

    Check that a new directory named "hello-world" was indeed created at your base path:

    2

    Write the main script

    Locate your pre-generated Python entry point (./hello-world/app/main.py) and add the code to the file.

    We'll make the app perform a few simple steps:

    • Read a string from the input text file (chunk).

    • Convert the string to a case matching the input parameter 'case'.

    • Write the result to a text file in the task results directory.

    3

    Check your manifest and template files

    The manifest and template files are automatically generated and located in your hello-world directory. Ensure they contain the correct configurations as shown below.

    Note: We're using passthrough partitioning and assembling engines in this template, so there's no need to configure these components.

    4

    Submit and activate your app

    Upload the content of your app:

    Activate your app to make it accept jobs:

    Now, check your app's details and status by running the command:

    Finally, ensure that your template was correctly uploaded—you will need that for running jobs.

    5

    Launch a job with 'hello-world-template'

    Let's launch a job with your new hello-world-template and test your app.

    Send a POST request to the Job Create endpoint, including the following fields in the request body:

    Key
    Value

    Then, launch your job and check the results.

    Here's a Postman collection that you can use to run your Hello World job:

    ~15 min

    Very Easy



    Exchange API key for access token
    🔐 Get an API key
  • Swagger Docs: https://api.bytenite.com/v1/auth/docs/

  • Specification: https://api.bytenite.com/v1/auth/docs/swagger.json

  • Notes

    ByteNite uses OAuth2 for authentication and authorization. OAuth2 is a widely-used open standard that allows applications to securely access resources on behalf of a user without exposing their credentials.


    Developer CLI

    The Dev CLI is a tool for developers to create and manage apps on ByteNite.

    Download & Install

    Linux

    Follow these steps to install the ByteNite CLI on Ubuntu, Debian, or similar distributions.

    1. Add the ByteNite Repository

    1. Update Package Lists

    1. Install the ByteNite CLI

    Troubleshooting

    If you encounter any issues during installation:

    • Make sure your system is up-to-date:

    • Verify the repository was correctly added:

    • Check if the package is available:

    Mac

    Installation

    1. Add the Bytenite Tap

    1. Install the CLI

    Additional Permissions for Mac Users

    Mac users might need to manually grant permissions in System Settings > Privacy & Security after executing a ByteNite command for the first time.

    Follow the necessary steps as shown in the image below to let your OS know ByteNite is safe to use.

    Updating

    1. Update Homebrew's formula list (including your tap)

    1. Upgrade the bytenite package specifically

    Windows

    Download and run the latest Windows release from .


    Verify Installation

    Check that the installation was successful by using:


    Authenticate

    To authenticate, run:

    This will open an oAuth2 authentication page in your browser. The login is automatic if you're already logged in on ByteNite.

    After successful authentication, credentials will be stored in the application support or configuration directory:

    • Linux: /$HOME/.config/bytenite-cli/auth-prod.json

    • Mac: /Users/[user]/Library/Application Support/bytenite-cli/auth-prod.json


    Commands & Usage

    Run the help command to get started with the ByteNite Dev CLI:

    Authentication

    • Authenticate with OAuth2: bytenite auth

    Version

    • Get Dev CLI Version: bytenite version

    App Commands

    • App Command Info: bytenite app --help

    • Initialize New App: bytenite app new [app_name]

    • Push/Upload App: bytenite app push [app_folder]

    Template Commands

    • Template Command Info: bytenite template --help

    • Initialize New Template: bytenite template new [template_id]

    • Push/Upload Template: bytenite template push [template_filepath]

    Engine Commands

    • Engine Command Help: bytenite engine --help

    • Initialize New Engine: bytenite engine new [engine_name]

    • Push/Upload Engine: bytenite engine push [engine_folder]

    Customer API

    About

    • Base URL: https://api.bytenite.com/v1/customer

    • Version: v1

    • Swagger Docs:

    • Specification:


    Job Templates

    A Job Template (or simply Template) combines Building Blocks into one configuration file for your jobs. It:

    • Provides instructions to the services that execute your job.

    • Ensures your app and data engines are connected correctly.

    By default, ByteNite generates a job template when you start building a new app. This allows you to focus on developing your app without needing to configure the other components upfront.

    However, since your app may expect specific data types or formats, you can create and customize a job template to link your app to the appropriate partitioning and assembling engines.

    Glossary

    A.

    App

    A ByteNite App is a custom software program consisting of application scripts and configuration files, designed by the user to operate on the ByteNite platform. An app can integrate with a partitioner and an assembler to enhance its distributed processing capabilities.

    bytenite app new hello-world
    ls
    manifest.json
    {
      "name": "hello-world",
      "version": "0.1",
      "platform": "docker",
      "description": "An app named hello-world",
      "entrypoint": "main.py",
      "platform_config": {
        "container": "python:latest"
      },
      "device_requirements": {
        "min_cpu": 2,
        "min_memory": 2
      }
    }
    template.json
    {
      "id": "hello-world-template",
      "description": "A template for hello-world",
      "app": "hello-world",
      "partitioner": "passthrough",
      "assembler": "passthrough"
    }
    bytenite app push hello-world
    bytenite app activate hello-world
    bytenite app get hello-world
    bytenite template get hello-world-template
    Pull/Download App: bytenite app pull [app_tag]
  • Get App Details: bytenite app get [app_tag]

  • List Existing Apps: bytenite app list

  • Activate App: bytenite app activate [app_tag]

  • Deactivate App: bytenite app deactivate [app_tag]

  • Get App Status: bytenite app status [app_tag]

  • Pull/Download Template: bytenite template pull [template_id]
  • Get Template Details: bytenite template get [template_id]

  • List Existing Templates: bytenite template list

  • Pull/Download Engine: bytenite engine pull [engine_tag]

  • Get Engine Details: bytenite engine get [engine_tag]

  • List Existing Engines: bytenite engine list

  • ByteNite CLI on GitHub
    MacOS System Settings, Privacy & Security, "bytenite" was blocked to protect your Mac, Allow Anyway
    Job Template file

    Example:

    How to create a job template

    You can either:

    1. Define the fields manually as shown in the example, or

    2. Generate a blank template using the ByteNite CLI:

    Key notes

    • When you create a new app, a template is generated automatically and is uploaded with the app.

    • If you prefer to manage templates separately, you can move your template out of the app folder and use the CLI to manage it independently.

    Your template includes a user-defined id and an optional description. Use the app, partitioner, and assembler fields to specify which components should be used in jobs built from this template:

    app string

    Description:

    An app tag to be used with this template.

    Supported Format:

    Please refer to the Tag definition.

    Examples:

    • "img-gen-diffusers"

    • "img-gen-diffusers@1"

    • "[email protected]"

    partitioner string

    Description:

    An engine tag to be used with this template.

    Supported Format:

    Please refer to the Tag definition.

    Examples:

    • "replicate-fanout"

    • "replicate-fanout@2"

    • "[email protected]"

    assembler string

    Description:

    An engine tag to be used with this template.

    Supported Format:

    Please refer to the Tag definition.

    Examples:

    • "zipper"

    • "zipper@3"

    • "[email protected]"

    echo "deb [trusted=yes] https://storage.googleapis.com/bytenite-prod-apt-repo/debs ./" | sudo tee /etc/apt/sources.list.d/bytenite.list
    sudo apt update
    sudo apt install bytenite
    sudo apt update && sudo apt upgrade
    cat /etc/apt/sources.list.d/bytenite.list
    apt search bytenite
    brew tap ByteNite2/bytenite-dev-cli https://github.com/ByteNite2/bytenite-dev-cli.git
    brew install bytenite
    brew update
    brew upgrade bytenite
    bytenite version
    bytenite auth
    bytenite --help
    template.json
    {
      "id": "img-gen-diffusers-template",
      "description": "A template for my img-gen-diffusers app",
      "app": "img-gen-diffusers@1",
      "partitioner": "replicate-fanout",
      "assembler": "zipper",
    }
    bytenite template new [template_name]
    Assembler

    An Assembler is a custom software program designed by the user to handle post-processing and fan-in operations on the ByteNite platform.

    Additional Info:

    • AKA: Assembling Engine

    Related Guides:

    • Assembling Engines

    B.

    ByteChip

    ByteChip is the internal currency used within the ByteNite platform for measuring and trading computing services. It is the standard unit to evaluate computing throughput provided by task runners. One ByteChip is equivalent to the price of an hour of computation on a machine with 1 CPU core and 1 GiB of RAM.

    Additional Info:

    • Abbreviation/ticker: BYC

    • Symbol:

    • ByteChips are not cryptocurrency

    P.

    Partitioner

    A Partitioner is a custom software program designed by the user to handle pre-processing and fan-out operations on the ByteNite platform.

    Additional Info:

    • AKA: Partitioning Engine

    Related Guides:

    T.

    Tag

    In ByteNite, a tag is a string used to identify a record by version. The tag format includes a required record name and an optional version in the format: [name]@[major].[minor] . The minor version is optional. Tag behavior follows these principles:

    • [name]@[major].[minor]

      Retrieves the record matching the exact name, major version, and minor version.

    • [name]@[major]

      Retrieves the record matching the exact name and major version, with the highest minor version.

    • [name]

      Retrieves the record by name with the highest major and minor versions.

    templateId

    hello-world-template

    dataSource

    {
        "dataSourceDescriptor": "url",
        "params": {
            "@type": "type.googleapis.com/bytenite.data_source.HttpDataSource",
            "url": "https://storage.googleapis.com/video-test-public/hello-world-I.txt"
        }
    }

    dataDestination

    {
        "dataSourceDescriptor": "bucket"
    }

    params

    {
        "app": {
            "case": "upper"
        }
    }
    https://api.bytenite.com/v1/customer/docs/
    https://api.bytenite.com/v1/customer/docs/swagger.json

    Containers & Environments

    Alongside your entry point script, ByteNite injects your container with environment variables. These variables provide paths to your app’s input and output folders, cache directories for data sharing and persistence, as well as job parameters and secrets for secure configuration.

    Configuring your app’s data flow using these variables ensures your job runs smoothly and interacts properly with ByteNite’s components.

    This page explains how ByteNite’s environment works for your containers, focusing on two key areas:

    • Secret management: How secrets are made available to your app (data source/destination linking, environment variable injection, and API-based access).

    • Cache directories: How ByteNite provides built-in directories for storing and accessing data at runtime.

    You’ll learn how to structure your platformConfig object within your manifest.json, what environment variables are available inside your container, and how these features impact your build and deployment process.


    🔑 Secret Management Approaches

    ByteNite supports multiple ways to provide secrets to your app, depending on your workflow:

    🔗 Job Data Source/Destination Linking

    How it works:

    • You link secrets to data sources/destinations (e.g., S3, GCS) during job submission (via UI or ).

    • The platformConfig's secrets property is typically not required for this approach.

    • The secret is referenced in the job’s , not in the platform config.

    Example (platformConfig):

    No need to reference secrets in platformConfig for data movement.

    Build/Deployment:

    • Build your container as usual.

    • ByteNite manages authentication and data transfer using the linked secrets, so your code never handles credentials.

    When to use:

    • When your job only needs to read or write data (like to S3 or GCS) and does not need to make custom API calls.

    • This method is simple and secure, as your code never sees the credentials and ByteNite manages all authentication and data transfer automatically.

    ✍️ Environment Variable Injection

    How it works:

    • Use this when your app code needs to interact with external services (APIs, SDKs, databases) that require credentials at runtime.

    • ByteNite injects your secrets as environment variables so your code can securely access them.

    Typical use cases:

    • Authenticating to external APIs (e.g., AWS, GCP, OpenRouter, Twilio, Hugging Face, etc.)

    • Connecting to managed databases or message queues

    • Using SDKs or CLI tools that expect credentials in environment variables

    Example (platformConfig):

    Once your manifest.json is configured, you can access the injected secrets in your code like shown below:

    Example (Python):

    Build/Deployment:

    • Build your container as usual.

    • Ensure your code reads secrets from environment variables.

    • Ensure the correct secret IDs are referenced in platformConfig.

    When to use:

    • When your code needs to make authenticated requests to external services, use cloud SDKs, or perform any operation that requires direct access to credentials at runtime.


    📂 ByteNite Cache Directory Environment Variables

    In addition to secrets, ByteNite automatically injects cache directory environment variables (USER_CACHE_DIR and SHARED_CACHE_DIR) into your container at runtime. These directories are essential for storing user-specific data and accessing shared resources within your app environment.

    For a full explanation of how these variables work, including usage examples and best practices, see the section.


    Summary:

    • Secrets: Use data source/destination linking for simple data movement, or environment variable injection for direct credential access in your code.

    • Cache Directories: Use USER_CACHE_DIR for user-specific, persistent storage; use SHARED_CACHE_DIR for global, read-only resources.

    • All these environment variables are automatically injected by ByteNite and available inside your container at runtime.

    By understanding these environment variables and secret management approaches, you can configure your containers securely and efficiently, and make the most of the ByteNite platform.

    AWS S3

    Introduction

    Amazon S3 (Simple Storage Service) is a scalable, high-speed, web-based cloud storage service designed for online backup and archiving of data and applications. It offers secure, durable, and highly-scalable object storage, making it ideal for a wide range of use cases, from data lakes and mobile applications to backup and restore operations.

    Follow the guide below to set up an account and get IAM credentials on AWS S3:

    Getting Started with S3
    main.py
    if __name__ == '__main__':
        print("Python task started")
        result_path = os.path.join(task_results_dir, 'processed_chunk.txt')
        try:
             # 1. Reading Inputs
        
            # Expect a text file to be passed by the partitioner
            with open(chunk_path, 'r', encoding="utf-8") as infile:
                my_string = infile.read()
    
            # 2. Handling Parameters
            
            # Expect the job parameters to have a key named 'case', and the options to be "upper", "lower", and "title"
            case = app_params['case']
    
            # 3. Developing the Core Functionality
            
            # Process the string based on the case parameter
            if case == "upper":
                my_string = my_string.upper()
            elif case == "lower":
                my_string = my_string.lower()
            elif case == "title":
                my_string = my_string.title()
            else:
                my_string = my_string
            
            # 4. Saving Outputs
    
            # Save the string directly into a text file to the default task results directory
            with open(os.path.join(task_results_dir, "hello_world_processed.txt"), 'w', encoding="utf-8") as outfile:
                outfile.write(my_string)
    
        except Exception as e:
            print("Python exception: ", e)
            raise e
    
    Building Blocks
    Partitioning Engines
    Building Blocks
    API
    data source/destination config
    Environment Variables
    {
      "container": "python:3.8-alpine",
      "private_image": false
    }
    {
      "container": "python:3.8-alpine",
      "private_image": false,
      "secrets": ["MY_SECRET_ID"]
    }
    # Retrieve the access & secret key for your secret
    access_key = os.environ.get('MY_SECRET_ID_ACCESS_KEY')
    secret_key = os.environ.get('MY_SECRET_ID_SECRET_KEY')

    Getting Started with AWS S3

    1. Create an AWS Account:

    Visit aws.amazon.com, click “Create an AWS Account”, and follow the steps to register. Provide payment information and verify your identity to activate the account.

    2. Access S3:

    Log in to the AWS Console, search for S3, and navigate to the S3 dashboard.

    3. Create a Bucket:

    • Click “Create Bucket” in the S3 dashboard.

    • Provide a unique bucket name and choose a region (e.g., us-east-1).

    • Keep public access blocked unless specific use cases require otherwise.

    • Finalize the setup by clicking “Create Bucket”.


    Setting Up IAM User for S3 Access

    1. Open IAM Service:

    In the AWS Console, search for IAM and go to Users.

    2. Create a User:

    • Click “Add Users”, provide a username (e.g., s3-bytenite-user), and enable Programmatic Access.

    • Attach the AmazonS3FullAccess policy or create a custom policy for specific bucket access.

    3. Generate Credentials:

    • Complete the user creation process and download the Access Key ID and Secret Access Key.

    • Save these credentials securely; they will not be displayed again.


    S3 Secret

    secretType : s3

    If your S3 bucket requires authentication for read or write access, set up a secret to store your S3 credentials securely with ByteNite (see )

    Here's an example of a request body of the Secrets endpoint for saving S3 keys:


    S3 Data Source Object

    dataSourceDescriptor : s3

    @type : type.googleapis.com/bytenite.data_source.S3DataSource

    Set up your data source with S3 using the your previously configured S3 secret and the following params :

    @type string

    Description:

    Use the type.googleapis.com/bytenite.data_source.S3DataSource params type.

    bucketName string

    Description:

    The name of your S3 bucket.

    Example:

    "my-app-data-bucket-12345"

    cloudRegion string

    Description:

    The S3 bucket's region name.

    Example:

    "us-east-2"

    name string

    Description:

    • Usage for Data Sources: The path to your input file following the bucket name.

    • Usage for Data Destinations: The path to the output folder following the bucket name. Note: a path will be created if it doesn't exist.

    Example:

    • Data Source: "/vids/big_buck_bunny.mp4"

    • Data Destination: "/vids/encoded/"

    secret_id string

    Description:

    The ID of an existing s3 secret.

    Example:

    "my_aws_secret"

    Here is an example S3 data source and destination request body:

    AWS

    ByteNite Computing Platform

    Introduction

    The ByteNite Computing Platform GUI is a web interface that enables users to manage and monitor distributed computing jobs on ByteNite, allowing users to launch, track, and control their workloads.


    Job Management

    Create New Jobs

    In order to create a new job, from the Jobs page, click the "New Job" button at the top. Here, you'll have two options:

    • Start from Scratch - you'll manually configure all parameters, including:

      • Job Details - job name and description

      • App Details - deployed app references for your partitioner, app, and assembler (you may specify versioning to test specific versions of your app, partitioner and assembler, by default the most recent version of each will be used)

    • Use a Template - Alternatively, you can pick an existing template from your Templates table and click on it to create a new job. This will give you the option to create a job to either run later or immediately, using the preconfigured data source and destination, parameters, and configs you defined in your selected template.

    Launch Jobs

    You can launch a new job immediately after configuration in Start from Scratch by clicking Create & Run Job, as shown in the demo video in the section above. Alternatively, clicking Create Job allows you to save the job as a draft. You can later execute it using job actions from the Jobs page or the job overview by selecting Run Job.

    You can additionally launch a job from a pre-saved template using Use a Template. Simply select the row of which template you would like to use and confirm that it is configured correctly. For more information on how to properly define your jobs, see the parameters in the Start from Scratch section above.

    Delete Jobs

    Remove jobs that are no longer needed, with confirmation prompts to prevent accidental deletion. This can be conducted through the Jobs page or through the red button on the top right of the specific job's Overview page.

    Job Logging & Monitoring

    View real-time statuses such as Running, Complete, and Failed, along with progress bars for each job on the Jobs page. More detailed, time-stamped task status tracking is available on the Job's Overview page.

    Additionally, the Job Overview page includes a Logs section, which contains logs from the partitioner, app, and assembler processes. While the logs are presented comprehensively, they can be filtered for troubleshooting by categories: error, warning, info, debug, and unknown. These logs are also queryable and downloadable.


    Task Management

    Tasks are the individual units of work that make up a job. Each job may consist of multiple tasks, which can be executed in parallel or sequence, depending on the workload.

    View Task Breakdown & Progress

    Inspect the list of tasks associated with a job, breaking down their time-stamped state (Scheduled, Assigned, Received, Running, Completed) and price. Deeper insights are available at the individual task level, including the container stats, network stats, and device info.

    Task Logs

    Access detailed logs for each task by clicking into that specific Task ID to diagnose issues at a granular level.


    Templates Management

    The Templates page allows users to observe and reuse submitted job templates for common or recurring workloads. Templates help ensure consistency, reduce setup time, and minimize errors when launching similar jobs. For info on using templates for job setup, view Use a Template in the section above.

    If you want to delete a template, simply select the ellipses at the end of the row of the desired template and click Delete.


    Security

    The Security section houses both the pages for API Key and Secret Management:

    API Keys

    The API Keys page allows users to securely generate and manage their personal API keys. These keys are essential credentials required to access the platform’s APIs, enabling programmatic interaction with ByteNite’s distributed computing services.

    On this page, users can:

    • Create New API Keys: Generate unique API keys for use in scripts, applications, or integrations that need to interact with the ByteNite platform outside of the web interface.

    • View and Copy Existing Keys: Easily view your active API keys and copy them for use in your development environment or automation tools.

    • Revoke Keys: Revoke keys that are no longer needed.

    Secrets

    The Secrets page lets you manage credentials used by your apps and engines across your jobs. ByteNite currently supports secret types from AWS, GCP, and Storj. All that's needed from you prior to setting up your secret is your Access Key and your Secret Key from that respective platform.

    Each secret is assigned a unique Secret ID, defined by you, which you can reference in your environment variable configuration to inject credentials at runtime—eliminating the need to hardcode sensitive values.

    For step-by-step instructions on using Secret IDs in environment variables, see: .


    Billing

    The Billing page is where users manage their transactions. It includes several key sections:

    Usage Overview

    This section displays ByteChip usage over a selected month. Users can adjust the view to focus on a specific month or template.

    Wallet Balance

    Here, users can add ByteChips to their account via Top Up or Coupon Redemption. This section also allows users to view and copy their account ID, check both total and available balances, and see the amount due. Additionally, it includes a Customer Portal button for accessing the ByteNite Stripe integration.

    Wallet Transactions

    This section lists all your transactions. It provides detailed information such as transaction type (Top Up, Coupon, Payment), description, costs in both ByteChips and USD, and the remaining balance.


    Contact Us

    The Contact Us page provides a simple way for users to reach the ByteNite team with questions, issues, or feedback. To submit a query, just fill out the following fields:

    • Email: Enter your email address so we can get back to you.

    • Summary: Provide a brief summary of your request or concern.

    • Description: Use this field to describe your issue or feedback in detail.

    Once submitted, our team will review your message and respond as soon as possible.


    Documentation

    The Documentation page will redirect you to page, where you can find detailed guides, feature overviews, and best practices for using the ByteNite Computing Platform.


    Developer CLI

    The Developer CLI page will take you directly to the page, explaining setup instructions, usage examples, and advanced command references.

    Google Cloud Storage

    Introduction

    Google Cloud Storage offers a highly scalable, secure, and durable object storage service designed to handle unstructured data across various use cases. With a unified API and integration across Google Cloud services, it supports efficient data retrieval and storage management. Its tiered storage options—ranging from high-performance to cost-effective archival—make it a versatile solution. Beyond its native ecosystem, Google Cloud Storage is widely adopted for hybrid and multi-cloud strategies due to its interoperability and global availability.

    Follow the guide below to set up an account and get HMAC credentials on GCP:

    Getting Started with Storage

    Storj

    Introduction

    Storj is a decentralized cloud storage platform that offers secure, private, and cost-effective data storage. By distributing data across a global network of nodes, Storj ensures highly-available and resilient data access, while securing cost savings to up to 90% than traditional cloud providers.

    Follow the guide below to set up an account and get S3-compatible access keys on Storj:

    Getting Started with
    POST /auth/secrets
    {
        "secret": {
            "id": "my_aws_secret",
            "secretType": "s3",
            "expiresAt": "2025-12-29T18:02:27.140Z", 
            "accessKey": "AKIAXXEXAMPLEEXAMPLEX",
            "name": "My AWS Full Bucket Access"
        },
        "secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
    }
    POST /customer/jobs/{jobId}/datasource
    {
        "dataSource": {  
            "dataSourceDescriptor": "s3", 
            "params": {  
                "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
                "name": "/vids/big_buck_bunny.mp4",
                "bucketName": "my-app-data-bucket-12345",
                "cloudRegion": "us-east-2",
                "secret_id": "my_aws_secret"
            }  
        },
        
        "dataDestination": {  
            "dataSourceDescriptor": "s3", 
            "params": {  
                "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
                "name": "/vids/encoded/",
                "bucketName": "my-app-data-bucket-12345",
                "cloudRegion": "us-east-2",
                "secret_id": "my_aws_secret"
            }  
        }
    }
    🔐 Setting up secrets
    Setup - data source and destination types, parameter configs for your app references, and timeout and retry configs.
    Create New Job
    Environment Variable Injection
    Introduction
    Developer CLI

    Setting Up Google Cloud Storage

    1. Create a Google Cloud Account:

    • Visit the Google Cloud website and click on “Get started for free.”

    • Follow the prompts to set up your account, including verifying your email and providing billing information.

    2. Access the Google Cloud Console:

    • Once your account is active, log in to the .

    3. Create a Storage Bucket:

    • In the console, navigate to the Cloud Storage section.

    • Click on “Create bucket.”

    • Provide a globally unique name for your bucket.

    • Select a location for your bucket (e.g., “US”).


    Generating Google Cloud Storage Credentials

    To allow ByteNite to interact securely with your Google Cloud Storage buckets, you need to create a service account and generate HMAC (Hash-based Message Authentication Code) credentials.

    1. Create a Service Account:

    • In the Google Cloud Console, navigate to IAM & Admin > Service Accounts.

    • Click on “Create Service Account.”

    • Provide a name (e.g., bytenite-service-account) and an optional description.

    • Click “Create and Continue.”

    2. Assign Permissions to the Service Account:

    • Assign the Storage Object Admin role to grant full control over objects in your buckets.

    • Click “Continue,” then “Done” to finish creating the service account.

    3. Generate HMAC Credentials:

    • In the Google Cloud Console, navigate to Cloud Storage > Settings.

    • Open the Interoperability tab.

    • Under Service Account HMAC, click “Create a key for a service account.”

    • Select the service account you created earlier (bytenite-service-account).

    Additional Notes:

    • For comprehensive details about creating buckets, refer to the official Google Cloud documentation on .

    • For detailed information on managing HMAC keys, consult the documentation on .


    Google Cloud Storage Secret

    secretType : gcp

    If your Google Cloud bucket requires authentication for read or write access, set up a secret to store your Service Account HMAC credentials securely with ByteNite (see 🔐 Setting up secrets)

    Here's an example of a request body of the Secrets endpoint for saving Google Cloud keys:


    Google Cloud Storage Data Source Object

    dataSourceDescriptor : gcp

    @type : type.googleapis.com/bytenite.data_source.S3DataSource

    Set up your data source with Google Cloud storage using the your previously configured gcp secret and the following params :

    @type string

    Description:

    Use the type.googleapis.com/bytenite.data_source.S3DataSource params type.

    bucketName string

    Description:

    The name of your Google Cloud bucket.

    Example:

    "my-app-data-bucket-12345"

    cloudRegion string

    Description:

    The Google Cloud bucket's region name.

    Example:

    "us-west2-b"

    name string

    Description:

    • Usage for Data Sources: The path to your input file following the bucket name.

    • Usage for Data Destinations: The path to the output folder following the bucket name. Note: a path will be created if it doesn't exist.

    Example:

    • Data Source: "/vids/big_buck_bunny.mp4"

    • Data Destination: "/vids/encoded/"

    secret_id string

    Description:

    The ID of an existing gcp secret.

    Example:

    "my_gcp_secret"

    Here is an example Google Cloud data source and destination request body:

    Getting Started with Storj

    1. Create a Storj Account Using ByteNite's Referral Link:

    Visit the link below to create an account on Storj

    🔗 Unlock 25 GB Free Storage on Storj - ByteNite's Referral Link

    Complete the registration process by verifying your email and setting up your password. You can start with a free trial or select a paid plan based on your needs.

    2. Log in to the Storj Console:

    Access your Storj console using your account credentials.

    3. Create a Project:

    • Once logged in, click “New Project.”

    • Provide a project name (e.g., “My S3 Project”).

    • Click “Create Project” to finalize.

    4. Create a Bucket:

    • Inside your project dashboard, navigate to the “Buckets” tab.

    • Click “New Bucket.”

    • Provide a bucket name (e.g., my-s3-bucket).

    • Optionally, configure additional settings such as default encryption or access permissions.


    Setting Up S3-Compatible Access Keys for Storj

    1. Navigate to API Keys:

    • Inside your project dashboard, click on the “Access Keys” tab in the navigation bar.

    2. Generate an Access Grant:

    • Click “New Access Key.”

    • Select the "S3 Credentials" configuration checkbox.

    • Choose the scope of the access (e.g., full project access or limited to specific buckets).

    3. Retrieve Your S3-Compatible Credentials:

    • Once the access grant is generated, the console will display the Access Key and Secret Key for S3 compatibility.

    • Save these credentials securely, as the Secret Key will not be shown again.


    Storj Secret

    secretType : storj

    If your Storj bucket requires authentication for read or write access, set up a secret to store your S3-compatible credentials securely with ByteNite (see 🔐 Setting up secrets)

    Here's an example of a request body of the Secrets endpoint for saving Storj keys:


    Storj Data Source Object

    dataSourceDescriptor : storj

    @type : type.googleapis.com/bytenite.data_source.S3DataSource

    Set up your data source with Storj using the your previously configured storj secret and the following params :

    @type string

    Description:

    Use the type.googleapis.com/bytenite.data_source.S3DataSource params type.

    bucketName string

    Description:

    The name of your Storj bucket.

    Example:

    "my-app-data-bucket-12345"

    cloudRegion string

    Description:

    Use global as the Storj bucket region.

    name string

    Description:

    • Usage for Data Sources: The path to your input file following the bucket name.

    • Usage for Data Destinations: The path to the output folder following the bucket name. Note: a path will be created if it doesn't exist.

    Example:

    • Data Source: "/vids/big_buck_bunny.mp4"

    • Data Destination: "/vids/encoded/"

    secret_id string

    Description:

    The ID of an existing storj secret.

    Example:

    "my_storj_secret"

    Here is an example Storj data source and destination request body:

    Storj

    Data Sources

    Data storage methods supported by ByteNite

    If your app needs data to function (which most do), it’s crucial to configure your data connections properly. This guide walks you through securely storing credentials, testing connections, and setting up your data sources.

    ByteNite jobs can read and write from popular storage services, including Amazon S3 and Google Cloud Storage buckets.

    How it works

    POST /auth/secrets
    {
        "secret": {
            "id": "my_gcp_secret",
            "secretType": "gcp",
            "expiresAt": "2025-12-29T18:02:27.140Z", 
            "accessKey": "GOOG1AB7QD3TY4NSFIZHD4KPB6LVB4F53UJGEZEMRJDXO5PUYDXAOSIKUFNI",
            "name": "GCP Bucket Admin Project 'My App'"
        },
        "secretKey": "aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890+/ExAmPlEkEy"
    }
    POST /customer/jobs/{jobId}/datasource
    {
        "dataSource": {  
            "dataSourceDescriptor": "gcp", 
            "params": {  
                "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
                "name": "/vids/big_buck_bunny.mp4",
                "bucketName": "my-app-data-bucket-12345",
                "cloudRegion": "us-west2-b",
                "secret_id": "my_gcp_secret"
            }  
        },
        
        "dataDestination": {  
            "dataSourceDescriptor": "gcp", 
            "params": {  
                "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
                "name": "/vids/encoded/",
                "bucketName": "my-app-data-bucket-12345",
                "cloudRegion": "us-west2-b",
                "secret_id": "my_gcp_secret"
            }  
        }
    }
    POST /auth/secrets
    {
        "secret": {
            "id": "my_storj_secret",
            "secretType": "storj",
            "expiresAt": "2025-12-29T18:02:27.140Z", 
            "accessKey": "jwcxl2mccgasmhs1dcir5ex4mple",
            "name": "Storj Full Access S3 Keys - Project 'My App'"
        },
        "secretKey": "jzwi4pcamnhyjpldu4my2cmfscmg55slex4mpleex4mpleex4mple"
    }
    POST /customer/jobs/{jobId}/datasource
    {
        "dataSource": {  
            "dataSourceDescriptor": "storj", 
            "params": {  
                "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
                "name": "/vids/big_buck_bunny.mp4",
                "bucketName": "my-app-data-bucket-12345",
                "cloudRegion": "global",
                "secret_id": "my_storj_secret"
            }  
        },
        
        "dataDestination": {  
            "dataSourceDescriptor": "storj", 
            "params": {  
                "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
                "name": "/vids/encoded/",
                "bucketName": "my-app-data-bucket-12345",
                "cloudRegion": "global",
                "secret_id": "my_storj_secret"
            }  
        }
    }

    Click “Create Bucket” to complete the setup.

    Choose a default storage class (e.g., “Standard”).

  • Set access control to “Uniform” to manage permissions uniformly at the bucket level.

  • Click “Create” to finalize the bucket setup.

  • Click “Create Key.”

  • The console will display the Access Key and Secret Key.

  • Important: Save these credentials securely, as the Secret Key will not be displayed again.

  • Google Cloud Console
    creating buckets
    HMAC keys
    Secrets
    handle external credentials securely.
  • Data Sources connect your storage options to your ByteNite jobs.

  • Once configured, secrets and data sources work seamlessly across any job.


    🔐 Setting up secrets

    If you’re using an authenticated service like S3, you’ll store your credentials securely in your ByteNite account—keeping them out of your code.

    Steps:

    1. Use the secretType field to select your secret provider (e.g., AWS, Google Cloud Storage).

      ByteNite supports multiple providers. See: ☁️ Supported data source options.

    2. Send a request to the Secrets endpoint to securely create and store your secret in your account.

      This unlocks access to your data sources without hardcoding credentials.

    Configure your secret request with the following parameters:

    id string

    Description:

    A given ID for your secret. Hint: Use a string that can easily help remember the credential's scope, permissions, and provider.

    Example:

    "aws_full_s3_access_key"

    name string

    Description:

    A descriptive name for your secret.

    Example:

    "John's AWS S3 Full Access Key"

    secretType string

    Description:

    The data source provider of this secret.

    Supported Values:

    Please see ☁️ Supported data source options

    Example:

    "s3"

    accessKey string

    Description:

    Your data source's access key.

    Example:

    "AKIAIOSFODNN7EXAMPLE"

    secretKey string

    Description:

    Your data source's secret key.

    Example:

    "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

    expiresAt string

    Description:

    A given expiry date for your secret, in ISO 8601 format.

    Example:

    "2025-12-29T18:02:27.140Z"

    Here's an example of a secret request body:


    🔗 Setting up data sources

    To enable input and output with your current storage provider, configure your data sources. You’ll provide a dataSource object for both inputs (called Data Source) and outputs (called Data Destination). Once both are set, you can:

    • Test your dataSource object by sending a request to the /datasource/test endpoint.

    • Attach a Data Source to a job via the dataSource field in the /jobs endpoint.

    • Attach a Data Destination to a job via the dataDestination field in the /jobs endpoint.

    About the dataSource Object

    The fields below define the dataSource object. Please note:

    • The params object varies depending on the data source type.

    • For data sources requiring authentication (like S3), provide the secret ID for the required credentials in the params body.

    • Use the bypass data source descriptor if your app doesn’t require input or output (e.g., no input data or output files).

    dataSourceDescriptor string

    Description:

    The data source type selector.

    Supported Values:

    Please see ☁️ Supported data source optionsfor all data source configuration parameters.

    Use bypass to skip a data source.

    Example:

    "s3"

    params object

    Description:

    The data source parameters.

    Supported Properties:

    • @type A params object type. Please see ☁️ Supported data source options.

    • Other parameters. Please refer to the specific guides under .

    Example:

    Here is a full dataSource object example:


    ☁️ Supported data source options

    Below is a list of currently supported data source connections and parameters for both inputs and outputs.

    I/O data sources

    Input-only data sources

    Output-only data sources

    Tutorial: Job with Hello, World! | ByteNite API DemosPostman
    POST /auth/secrets
    {
        "secret": {
            "id": "aws_full_s3_access_key",
            "name": "John's AWS S3 Full Bucket Access",
            "secretType": "s3",
            "accessKey": "AKIAXXEXAMPLEEXAMPLEX",
            "expiresAt": "2025-12-29T18:02:27.140Z"    
        },
        "secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
    }
    POST /customer/jobs/datasource/info
    {
        "dataSource": {  
            "dataSourceDescriptor": "s3", 
            "params": {  
                "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
                "name": "/vids/big_buck_bunny.mp4",
                "bucketName": "my-app-data-bucket-12345",
                "cloudRegion": "us-east-2",
                "secret_id": "aws_full_s3_access_key"
            }  
        }
    }

    AWS S3

    secretType : aws

    dataSourceDescriptor : aws

    @type : type.googleapis.com/bytenite.data_source.S3DataSource

    Google Cloud Storage

    secretType : gcp

    dataSourceDescriptor : gcp

    @type : type.googleapis.com/bytenite.data_source.S3DataSource

    Storj

    secretType : storj

    dataSourceDescriptor : storj

    @type : type.googleapis.com/bytenite.data_source.S3DataSource

    Generic HTTP

    dataSourceDescriptor : url

    @type: type.googleapis.com/bytenite.data_source.HttpDataSource

    File Upload

    dataSourceDescriptor : file

    @type: type.googleapis.com/bytenite.data_source.LocalFileDataSource

    Temporary Bucket

    dataSourceDescriptor : bucket

    ☁️ Supported data source options
    Cover
    Cover
    Cover
    Cover
    Cover
    Cover
    {  
        "@type": "type.googleapis.com/bytenite.data_source.S3DataSource",  
        "name": "/vids/big_buck_bunny.mp4",
        "bucketName": "my-app-data-bucket-12345",
        "cloudRegion": "us-east-2",
        "secret_id": "aws_full_s3_access_key"
    }

    Jobs

    A general guide for submitting jobs via API

    Once your Apps, Partitioning Engines, and Assembling Engines are ready, and you've linked them together using Job Templates, you're prepared to launch test and production jobs.

    ByteNite utilizes an API to handle job requests — the Customer API— simplifying and standardizing the interaction with our server.

    To begin using the API and familiarizing yourself with its endpoint, we recommend setting up a Postman collection. You can find more details at Create a Postman collection from ByteNite's OAS.

    Below are the steps to configure and send a new job request, broken down and explained. You may refer to the official Jobs reference for a complete parameter list, response codes, and default code examples.

    1

    Get an Access Token

    Begin by obtaining a temporary access token to authenticate your requests.

    POST https://api.bytenite.com/v1/auth/access_token


    Main ref:

    Name
    Type
    Description

    Example:

    2

    Create a New Job

    Submit a new job request using an existing job template, and give it a name.

    POST https://api.bytenite.com/v1/customer/jobs


    3

    Submit a Data Source and Destination

    Link a data source and destination to your job, specifying input and output options as documented in the guide.

    Connecting data sources is optional: if your app doesn't require any input data to work, or doesn't output data, you can specify a bypass data source descriptor.

    4

    Submit Job Parameters

    If your app, partitioner, or assembler expect parameters, provide them at this step. Parameters are organized under three keys: app, partitioner, and assembler for clarity.

    If your template includes parameter schemas, the parameters you submit here will be validated immediately, and any errors will be returned.

    5

    Launch the Job

    Run the job, including execution configurations if needed.

    Please note that you need this call to initiate the processing of your job. Without this step, your job will remain in a draft state.

    POST https://api.bytenite.com/v1/customer/jobs/{jobId}/run

    This page is under construction! Please come back later...

    Name
    Type
    Description

    token

    string

    Your ByteNite access token

    expiresIn

    string

    An expiration timeout in seconds

    Main ref: Create
    Name
    Type
    Description

    Authorization

    string

    An active ByteNite access token

    Name
    Type
    Description

    templateId

    string

    ID of the job template used for this job

    name

    string

    A descriptive name for your job

    description

    string

    An optional description with more information

    Name
    Type
    Description

    job

    object

    A job object, containing job metadata

    ↳ id

    string

    The job identifier (automatically generated)

    Example:

    PATCH
    https://api.bytenite.com/v1/customer/jobs/{jobId}/datasource

    Main ref: Update

    Name
    Type
    Description

    jobId

    string

    The jobIdof your new job

    Name
    Type
    Description

    Authorization

    string

    An active ByteNite access token

    Name
    Type
    Description

    dataSource

    object

    A data source object, containing a dataSourceDescriptor and optional params

    dataDestination

    object

    A data source object, containing a dataSourceDescriptor and optional params

    Example:

    PATCH https://api.bytenite.com/v1/customer/jobs/{jobId}/params


    Main ref: Update

    Name
    Type
    Description

    jobId

    string

    The jobIdof your new job

    Name
    Type
    Description

    Authorization

    string

    An active ByteNite access token

    Name
    Type
    Description

    app

    object

    A JSON object containing parameters as expected by your app

    partitioner

    object

    A JSON object containing parameters as expected by your partitioning engine

    assembler

    object

    A JSON object containing parameters as expected by your assembling engine

    Example:


    Main ref: Manage

    Name
    Type
    Description

    jobId

    string

    The jobIdof your new job

    Name
    Type
    Description

    Authorization

    string

    An active ByteNite access token

    Name
    Type
    Description

    taskTimeout

    integer

    An optional timeout for tasks, in seconds. After this time, a task will be stopped.

    jobTimeout

    integer

    An optional timeout for jobs, in seconds. After this time, the job and any running tasks will be stopped.

    isTestJob

    boolean

    A flag for test jobs.

    Example:

    apiKey

    string

    Your ByteNite API Key

    Data Sources
    Access Token
    POST /auth/access_token
    import requests
    
    response = requests.post(
        "https://api.bytenite.com/v1/auth/access_token",
        json = {
            "apiKey": "ey2WmEsSMK7wdxpK5MaEHXeWCD5KEJZ79Koe68yrHL4kdnnTXT01hu2iss43BdaCCMgJ3dBh2IOVCycTt1mwkT3QR1dLxRFpK7TW7ExvcuCXio6nKsGjk9dYY8nbsFffrUVvYSQYsuQoF3NIb8sS4MDyZfOgGKZL9z8x22cwrwEck7vIokVhQ9fyWRVU2vwRiX3X4bQFuqTkkWCi5Vfy8IkGkga7ZPMPb21FxqK6cHRJ3zmI1JZZoZZxERnQcWJTpZRyCP4SNTuRm3ueVDNntFqYWYYrseNLcCIS42MpR00Z9rI9I5xxuQD6VQvHVrpOaPucg1E4Vw54xXr2LKEy9uHcM5WUQHkdfhiXo6zyVbZMrbjLpepgeS4nEja="
        }
    )
    
    token = response.json()["token"]
    POST /customer/jobs
    response = requests.post(
        "https://api.bytenite.com/v1/customer/jobs",
        headers = {
            "Authorization": token
        },
        json = {
            "name": "My job with img-gen-diffusers template",
            "templateId": "img-gen-diffusers"
        }
    )
    
    jobId = response.json()["job"]["id"]
    PATCH /customer/jobs/{jobId}/datasource
    response = requests.patch(
        f"https://api.bytenite.com/v1/customer/jobs/{jobId}/datasource",
        headers = {
            "Authorization": token
        },
        json = {  
            "dataSource": {
                "dataSourceDescriptor": "url",
                "params": {
                    "@type": "type.googleapis.com/bytenite.data_source.HttpDataSource",
                    "url": "https://storage.googleapis.com/my-public-bucket/my-input-file.txt"
                }
            },
            "dataDestination": {
                "dataSourceDescriptor": "bucket"
            }
        }
    )
    PATCH /customer/jobs/{jobId}/params
    response = requests.patch(
        f"https://api.bytenite.com/v1/customer/jobs/{jobId}/params",
        headers = {
            "Authorization": token
        },
        json = {
            "partitioner": {
                "numImages": 20
            },
            "app": {
                "prompt": "A beautiful sunset over the jungle"
            },
            "assembler": {
                "outExtension": "jpeg"
            }
        }
    )
    PATCH /customer/jobs/{jobId}/params
    response = requests.post(
        f"https://api.bytenite.com/v1/customer/jobs/{jobId}/run",
        headers = {
            "Authorization": token
        },
        json = {
            "taskTimeout": 3600,
            "jobTimeout": 86400,
            "isTestJob": True
        }
    )

    Redeem promo code

    post

    Redeem a promo code

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    couponCodestringOptionalExample: hello-world
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /redeem_coupon

    Get exchange rate in ByteChips for a currency

    get

    Convert amount from currency to ByteChips

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    currencystringOptional
    currencyAmountnumber · doubleOptional
    amountnumber · doubleOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /exchange_rate

    Get transaction history

    get

    Get paginated list of transactions

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    pagination.limitinteger · int64Optional

    Number of rows to return per page.

    pagination.offsetinteger · int64Optional

    Number of rows to skip before starting to collect the result set.

    orderBystringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /transactions

    Get transaction history with filters

    post

    post paginated list of transactions with filters

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    orderBystringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /transactions/filter

    Get transaction history as CSV

    get

    Get CSV of all transactions

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /transactions/csv

    Get wallet balance

    get

    Get wallet balance for current user

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /balance

    Apps

    An App is a versioned program that lets you run code on ByteNite.

    Apps can be simple—just a single function—or complex systems with multiple libraries and functions.

    This guide walks through the structure of an app’s directory and explains where (and how) to write your code so it integrates smoothly into a ByteNite app.

    📁 App directory overview

    To create a new app directory in your local environment, execute the following command:

    {
      "id": "text",
      "code": "text",
      "amount": "text"
    }
    POST /v1/wallet/redeem_coupon HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 28
    
    {
      "couponCode": "hello-world"
    }
    GET /v1/wallet/exchange_rate HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "currency": "text",
      "currencyAmount": 1,
      "exchangeRate": 1,
      "amount": 1
    }
    {
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      },
      "data": [
        {
          "id": "18bea1a1-85c9-4652-a32f-4bad10c45d2b",
          "createdAt": "2024-12-12T06:59:38.653263Z",
          "accountFrom": "a946a5f3-f430-4f1d-ac58-165190436c7c",
          "accountTo": "stripe-main",
          "amount": 0.00022723,
          "transactionType": "payment",
          "relatedEntity": {
            "type": "text",
            "id": "text",
            "name": "text"
          },
          "notes": "",
          "transactionData": "",
          "hash": "863078c0dcab8b7eea27ed1ec4ba19109208442147fb97050d71527591c035ce",
          "relatedEntityData": {
            "type": "payment",
            "id": "33e247f5-5000-4476-8fb4-8fb34d733083",
            "name": "",
            "jobName": "Job 4ce85f9a-92ec-447a-8622-5ad684dcb880",
            "jobId": "4ce85f9a-92ec-447a-8622-5ad684dcb880",
            "description": "Top-up for Job 4ce85f9a-92ec-447a-8622-5ad684dcb880",
            "currency": "USD",
            "currencyAmount": 1000,
            "exchangeRate": 1,
            "couponCode": "COUPONCODE",
            "jobTemplate": "4ce85f9a-92ec-447a-8622-5ad684dcb880"
          },
          "description": "Job 4ce85f9a-92ec-447a-8622-5ad684dcb880",
          "balance": 0
        }
      ]
    }
    GET /v1/wallet/transactions HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      },
      "data": [
        {
          "id": "18bea1a1-85c9-4652-a32f-4bad10c45d2b",
          "createdAt": "2024-12-12T06:59:38.653263Z",
          "accountFrom": "a946a5f3-f430-4f1d-ac58-165190436c7c",
          "accountTo": "stripe-main",
          "amount": 0.00022723,
          "transactionType": "payment",
          "relatedEntity": {
            "type": "text",
            "id": "text",
            "name": "text"
          },
          "notes": "",
          "transactionData": "",
          "hash": "863078c0dcab8b7eea27ed1ec4ba19109208442147fb97050d71527591c035ce",
          "relatedEntityData": {
            "type": "payment",
            "id": "33e247f5-5000-4476-8fb4-8fb34d733083",
            "name": "",
            "jobName": "Job 4ce85f9a-92ec-447a-8622-5ad684dcb880",
            "jobId": "4ce85f9a-92ec-447a-8622-5ad684dcb880",
            "description": "Top-up for Job 4ce85f9a-92ec-447a-8622-5ad684dcb880",
            "currency": "USD",
            "currencyAmount": 1000,
            "exchangeRate": 1,
            "couponCode": "COUPONCODE",
            "jobTemplate": "4ce85f9a-92ec-447a-8622-5ad684dcb880"
          },
          "description": "Job 4ce85f9a-92ec-447a-8622-5ad684dcb880",
          "balance": 0
        }
      ]
    }
    POST /v1/wallet/transactions/filter HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 216
    
    {
      "pagination": {
        "limit": 1,
        "offset": 1
      },
      "filters": [
        {
          "field": "text",
          "condition": "FILTER_CONDITION_EQ",
          "value": {
            "@type": "type.googleapis.com/google.protobuf.Value",
            "value": "value to filter (any type)"
          }
        }
      ],
      "orderBy": "text"
    }
    GET /v1/wallet/transactions/csv HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "csv": "text"
    }
    GET /v1/wallet/balance HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "accountId": "18bea1a1-85c9-4652-a32f-4bad10c45d2b",
      "totalBalance": 10019.4719491,
      "availableBalance": 10019.4719491,
      "amountDue": 50
    }
    A sample folder with pre-populated files and fields will be generated at your current path:

    Directory Structure:

    • app/ Contains your application’s entry point (main.*), plus any additional scripts or libraries. See: 👨🏽‍💻 Develop the main script.

    • manifest.json Holds configurations, details, and app requirements. See: 🔧 Configure app settings: manifest.json.

    • template.json Defines your job template, which ties together your building blocks into a single configuration. This template can be optionally submitted with your app. Learn more: #.

    • schema.json Provides input parameter validation for your app using a JSON schema definition. See:.


    🔧 Configure app settings: manifest.json

    The manifest.json file holds the core details of your app—things like platform configuration, hardware requirements, the app’s name, and version.

    Here’s a sample manifest:

    How the manifest works

    The manifest defines key settings your app depends on, including:

    • Platform configuration (e.g., Docker container + data source details)

    • Hardware requirements (e.g., minimum CPU and memory)

    • App metadata (name, version, description)

    Since many apps rely on specific hardware or container setups, tweaking this file to align with your app’s needs is essential for reliable performance.

    The following sections dive deeper into app versioning, platform settings, and hardware requirements—all centered around how to define them in your manifest.json.


    App versioning

    Each app is identified by a name and a version, following the semantic versioning format "major.minor".

    • Unlimited versions: You can store and activate unlimited versions of your app, provided that each one has a unique (name, version) pair.

    • Uploading a new version: Uploading an app with a new (name, version) combination will create a new, independent record. This is helpful if you need to maintain separate versions for testing, staging, or production.

    • Updating versions: Uploading an app with an existing (name, version) pair will overwrite the current version with your updated code and configurations.

    Use the name and version fields in the manifest to manage app uploads and ensure consistency across your deployments:

    name string

    Description:

    The human-readable name of your app. This acts as the app’s identifier.

    Supported Format:

    • Alphanumeric characters, dashes (-), and underscores (_)

    • Max length: 64 characters

    Example:

    "my-first-stable-diffusion-app"

    version string

    Description:

    A semantic version for managing updates.

    Supported Format:

    "[major].[minor]"

    • major int

    • minor int

    Example:

    "0.4"


    Platform & hardware requirements

    ByteNite supports containerized workloads by integrating with Docker images from Docker Hub. Docker lets you package your app’s dependencies, libraries, and runtime into a single, portable container—so your app runs consistently across environments.

    To configure your app’s environment:

    • Define the platform type and the container image using the platform and platformConfig fields in your manifest.

    • Set your app’s minimum hardware requirements (like CPU and memory) using the deviceRequirements field.

    These settings ensure your app runs in the right environment with the right resources. Learn more below.

    Platform Configs

    To run your app on ByteNite, use the platform and platformConfig fields in the manifest to define the Docker container image your app should use.

    The container image must be either publicly accessible or include the proper credentials if it’s private. It can be hosted on Docker Hub or any compatible container registry.

    While there are many ready-to-use images, most apps require custom images tailored to specific dependencies, environment variables, or system configurations. Defining this ensures your app runs exactly how you need it.

    platform string

    Description:

    Specifies the platform your app will run on.

    Supported Values:

    • ["docker"]

    platformConfig object

    Description:

    Contains platform-specific configurations.

    Supported Properties:

    • container string A Docker container image reference. Refer to the official to choose the right base image for your app. Examples:

      • "python:3.8-alpine"

      • "tensorflow/tensorflow:latest-gpu"

      • "blender/blender:latest"

    • private_image boolean Set this to true if your image repository is private.

    • username string Your Docker Hub username (only needed if private_image is true).

    • token string Your for authenticating image pull requests (only required if private_image is true).

    • secrets object Your chosen secret_id , generated when to your respective data source provider (e.g., AWS, Google Cloud Storage).

    Example:

    In summary, these are the suggested steps to pair your ByteNite app with a Docker container image:

    1. Build or choose a Docker image with all the necessary libraries and dependencies.

    2. Develop your app’s logic outside the image—place your code in the app/ directory.

    3. Upload your app using the ByteNite CLI, referencing your Docker image in the manifest file.

    Hardware Requirements

    At ByteNite, we handle the infrastructure so you can focus on building your apps—not worrying about hardware.

    To ensure smooth performance, you’ll define your app’s minimum hardware requirements, like the number of CPU cores and memory size. This helps ByteNite allocate machines that meet (or exceed) these requirements, making sure your app runs reliably.

    You set these requirements in the deviceRequirements field of your manifest.json.


    👨🏽‍💻 Develop the main script

    The entry point script powers your app’s core functionality—it reads input chunks, processes data, and returns results.

    What your script can do is nearly limitless. You can run model inferences, process large datasets, render video frames, generate PDFs in bulk, or scrape the web. If it can run inside a container, it can run on ByteNite.

    See: Examples of core processing use cases for common serverless job examples.

    If needed, extend your entry point script by adding custom scripts or libraries to the app/ folder. These can be imported into your main script to support your logic.

    The key requirement is how you handle inputs, parameters, and outputs. These must follow ByteNite’s conventions to ensure your workflow runs smoothly across distributed infrastructure.

    How ByteNite Executes Your Script

    • ByteNite pulls the container image specified in your manifest.

    • It overrides the container’s original entry point and runs the ByteNite entry point script instead—your script inside the app/ folder.

    This script must align with the programming language and libraries supported by your container image.

    Make sure any external dependencies your code needs are installed in the container image. This ensures they’re available at runtime.

    Important: Container Entrypoint ≠ ByteNite Entrypoint

    When your app runs:

    • ByteNite launches the container based on your specified image.

    • Your container’s original entrypoint is overridden.

    • ByteNite runs its own entrypoint to execute the script inside the app/ folder.

    This setup ensures your runtime environment stays flexible and modular—making it easier to iterate on your app’s logic without changing the container itself.

    Default environment variables

    Alongside your entry point script, ByteNite injects your container with environment variables. These variables provide paths to your app’s input and output folders, cache directories for data sharing and persistence, as well as job parameters and secrets for secure configuration.

    Configuring your app’s data flow using these variables ensures your job runs smoothly and interacts properly with ByteNite’s components.

    Here are the six preset ByteNite App environment variables:

    TASK_DIR environment variable

    Description:

    Contains the path to the directory holding a single input data chunk. The chunk is stored in a file named data.bin.

    • This file holds the raw binary input data for your task, passed by the Partitioning Engine.

    • If you use a passthrough partitioner, data.bin is the original data source.

    The directory is automatically created and contains only this one chunk—you don’t need to manage it manually. Just use this variable to access the input file.

    Be sure to load and decode data.bin based on your app’s expected data type.

    If your app doesn’t process input files, you can skip this step.

    Usage (Python):

    TASK_RESULTS_DIR environment variable

    Description:

    This is the directory where your app should store processed results. Files saved here must be readable by the Assembling Engine.

    • The assembler collects these files across all runs of your app.

    • For passthrough assemblers, any file saved here is directly uploaded to the job’s data destination.

    The folder is automatically created inside your app's environment. There’s no required output format—just make sure the assembler can access the files.

    Usage (Python):

    SHARED_CACHE_DIR environment variable

    Description:

    Contains the path to a global, shared, read-only directory that is accessible to every app, partitioner, and assembler running on ByteNite. This directory is managed by ByteNite and is intended for large, immutable resources that needs to be accessed by your code.

    • Use this directory to access resources such as pre-trained model weights, reference datasets, or common binaries.

    • Any files placed here are available in read-only mode to all running jobs, from any user.

    The directory is automatically mounted and made available by ByteNite. You do not need to manage its contents or permissions.

    Usage (Python):

    USER_CACHE_DIR environment variable

    Description:

    Contains the path to a user-specific, read/write directory. This directory is unique to each user and is shared across all jobs run by that user.

    • Use this directory to store temporary files, intermediate results, or artifacts that are specific to your user.

    The directory is automatically created and isolated per user. You do not need to set up or clean up this directory manually.

    Usage (Python):

    APP_PARAMS environment variable

    Description:

    This variable provides your app with parameters passed through a job. It contains a dictionary based on the data provided in the Create Job request (under params -> app).

    These parameters let you adjust your app’s behavior per job.

    For example, a parameter like "case" could control output string formatting, or a parameter "prompt" might contain a text prompt for a stable diffusion pipeline.

    Usage (Python):

    <SECRETS> environment variable

    Description

    This environment variable grants your app access to all your secrets stored on ByteNite needed for execution. All referenced secrets are injected at runtime, making them available when your app starts. For details on secret fields, see Setting Up Secrets. You can access secrets programmatically in two ways:

    1. Individual Secret Keys For specific secrets with a known secret_id, each credential is injected as a separate environment variable. For example:

    • {{secret_id}}_ACCESS_KEY

    • {{secret_id}}_SECRET_KEY

    Usage (Python):

    1. Accessing Custom Type Secrets

    For secrets with a secretType of "other", the secretKey can be accessed directly using the environment variable {{secret_id}}.

    Usage (Python):

    Example: Python entry point script

    Here’s an example of a Python-based entry point script (main.py) that uses the environment variables we just covered.


    ☑️ (Optional) Require Parameter Validation: schema.json

    If your app receives parameters, validating them ahead of time ensures they follow a defined structure. This helps prevent issues like missing keys or malformed data.

    You can define a JSON Schema in the schema.json file inside your app directory.

    Any input parameters submitted to the Jobs API will be checked against this schema before the job starts.

    Example Schema

    Here’s an example of a schema that requires a single input string (prompt) with a maximum length of 50 characters:

    Why Use a Schema?

    • Prevents errors:

      Ensures parameters meet your expected format before the job runs.

    • Generates UI:

      The schema automatically creates a graphical interface in your Job Launch console, making it easy for you (or your users) to configure and launch jobs from the UI.


    💡 App Development Tips

    To get the most out of your ByteNite apps, keep the following principles in mind:

    • Your app code is executed by distributed task runners. Each task runs independently on a worker machine, based on how your data is partitioned. → Only include the logic that should run on a single worker—ByteNite handles all task distribution and resource orchestration for you.

    • Within each worker, your app can take advantage of multi-core architectures. You’re free to parallelize work across available CPU cores using threads or multiprocessing.

    • Avoid implementing custom distributed systems logic. ByteNite’s platform is designed to manage scaling, scheduling, and fault tolerance for you.

    • Ensure your data sources are properly configured via the Customer API (see ). Custom data ingestion or export logic within your app can lead to errors, inefficient performance, or increased container runtime—and ultimately, higher costs.

    • Incorporate robust error handling and logging. This is essential for monitoring, debugging, and improving the reliability of your app in production.

    In summary:

    ✅ Do’s

    • Define the core functionality of your app.

    • Use multiple CPU cores to process subtasks in parallel within a single worker.

    ❌ Don’ts

    • Distribute tasks to other workers or machines. → Your app already runs within ByteNite’s distributed environment.

    • Read from or write to additional data sources directly. → Input/output is managed by ByteNite’s Partitioning and Assembling Engines.

    ⚠️ Use with Caution

    • Interact with external services or APIs only when necessary, and only if the required functionality cannot be handled by ByteNite’s Data Engines or built-in integrations.

    Developer CLI
    bytenite app new [app_name]
    /[app_name]
    ├── app
    │   ├── main.*
    │   └── [scripts/libraries]
    ├── manifest.json
    ├── template.json
    └── schema.json
    manifest.json - full example
    {
      "name": "my-first-stable-diffusion-app",
      "version": "0.4",
      "description": "A stable diffusion app using HuggingFace's diffusers",
      "platform": "docker",
      "entrypoint": "main.py",
      "platform_config": {
        "container": "huggingface/diffusers-pytorch-cuda:latest",
        "private_image": true,
        "username": "alex_rivers6241",
        "token":"dckr_pat_HgNOmERVLDm1YBSvAJELJeGOOAM",
        "secrets":["MY_GCS_SECRET"]
      },
      "device_requirements": {
        "min_cpu": 2,
        "min_memory": 2,
        "gpu": ["NVIDIA A100-SXM4-40GB", "NVIDIA GeForce RTX 4090"] 
      }
    }
    # === BYTENITE APP - MAIN SCRIPT ===
    
    # Documentation: https://docs.bytenite.com/create-with-bytenite/building-blocks/apps
    
    # == Imports and Environment Variables ==
    
    try:
        import json
        import os
    except ImportError as e:
        raise ImportError(f"Required library is missing: {e}")
    
    # Path to the directory containing a single data chunk, passed by your partitioner.
    # Note: This folder is automatically created and contains only one chunk. You don't need to create or manage it.
    task_dir = os.getenv('TASK_DIR')
    if not task_dir:
        raise ValueError("TASK_DIR environment variable is not set or is invalid.")
    chunk_path = os.path.join(task_dir, 'data.bin')
    
    # Path to the folder where your app's task results must be saved. The assembler will access these files across all runs of your app.
    # Note: The folder is automatically created and passed to your app. There is no required output format—just ensure your assembler can read the files.
    task_results_dir = os.getenv('TASK_RESULTS_DIR')
    if not task_results_dir:
        raise ValueError("TASK_RESULTS_DIR environment variable is not set or is invalid.")
    
    # App parameters imported from the job request (located under "params" -> "app").
    app_params_raw = os.getenv('APP_PARAMS')
    if not app_params_raw:
        raise ValueError("APP_PARAMS environment variable is not set or is empty.")
    try:
        app_params = json.loads(app_params_raw)
    except json.JSONDecodeError as e:
        raise ValueError(f"APP_PARAMS environment variable contains invalid JSON: {e}")
    
    
    if __name__ == '__main__':
        print("Python task started")
        result_path = os.path.join(task_results_dir, 'processed_chunk.txt')
        try:
            # --------------
            # 1. Reading Inputs
        
            # Example: Expect a text file to be passed by the partitioner
            with open(chunk_path, 'r', encoding="utf-8") as infile:
                my_string = infile.read()
    
            # --------------
            # 2. Handling Parameters
            
            # Example: Expect the job parameters to have a key named 'case', and the options to be "upper", "lower", and "title"
            case = app_params['case']
    
            # --------------
            # 3. Developing the Core Functionality
            
            # Example: Process the string based on the case parameter
            if case == "upper":
                my_string = my_string.upper()
            elif case == "lower":
                my_string = my_string.lower()
            elif case == "title":
                my_string = my_string.title()
            else:
                my_string = my_string
            
            # --------------
            # 4. Saving Outputs
    
            # Example: Save the string directly into a text file to the default task results directory
            with open(os.path.join(task_results_dir, "hello_world_processed.txt"), 'w', encoding="utf-8") as outfile:
                outfile.write(my_string)
    
        except Exception as e:
            print("Python exception: ", e)
            raise e
    
    schema.json
    {
      "$id": "db://image-generation-simple-inputs",
      "definitions": {
        "input": {
          "type": "string",
          "description": "A prompt for image generation",
          "maxLength": 50
        }
      },
      "properties": {
        "prompt": {
          "$ref": "#/definitions/input"
        }
      },
      "required": ["prompt"],
      "title": "Stable Diffusion App Schema"
    }
    Job Templates
    Docker documentation
    Docker Hub Personal Access Token (PAT)
    Setting up Your Secrets
    Data Sources
    ☑️ (Optional) Require Parameter Validation: schema.json
    {
        "container": "huggingface/transformers-pytorch-cpu:latest",
        "private_image": true,
        "username": "alex_rivers6241",
        "token":"dckr_pat_HgNOmERVLDm1YBSvAJELJeGOOAM",
        "secrets": ["MY_S3_KEY"]
    }
    task_dir = os.getenv('TASK_DIR')
    chunk_path = os.path.join(task_dir, 'data.bin')
    task_results_dir = os.getenv('TASK_RESULTS_DIR')
    shared_cache_dir = os.getenv('SHARED_CACHE_DIR')
    model_path = os.path.join(shared_cache_dir, 'Llama-4-Scout-17B-16E-Instruct-Q4_K_M-00001-of-00002.gguf')
    user_cache_dir = os.getenv('USER_CACHE_DIR')
    file_path = os.path.join(user_cache_dir, 'intermediate_results.npy')
    app_params = json.loads(os.getenv('APP_PARAMS'))
    access_key = os.environ.get('{{secret_id}}_ACCESS_KEY')
    secret_key = os.environ.get('{{secret_id}}_SECRET_KEY')
    secret_key = os.environ.get('{{secret_id}}')

    Create or update a secret

    post

    Save a secret for data sources/destinations usage

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    secretKeystringRequired

    Your data source's secret key.

    Example: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /secrets

    List available secrets

    get

    List available secrets

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    secretTypestringOptional

    The type of the secret

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /secrets

    Remove a secret

    delete

    Remove a secret

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    secretTypestringRequired

    The type of the secret

    idstringRequired

    The ID of the secret

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    delete
    /secrets/{secretType}/{id}

    Generic information about user

    get

    Get id, email, name, image and activation status

    Required scopes
    This endpoint requires the following scopes:
    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /user

    Set user info

    patch

    Set editable user info

    Required scopes
    This endpoint requires the following scopes:
    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    firstNamestringOptionalExample: John
    lastNamestringOptionalExample: Doe
    userNamestringOptionalExample: johndoe
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    patch
    /user

    Generic information about user

    get

    Get all issued api keys for user

    Required scopes
    This endpoint requires the following scopes:
    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /api_keys

    Revoke an API key

    post

    Revoke an API key

    Required scopes
    This endpoint requires the following scopes:
    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    idstringRequired
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /api_keys/{id}/revoke

    Exchange API key for access token

    post

    Exchange an API key for an oAuth2 access token

    Body
    apiKeystringRequired

    The actual API key that you have received from the API key request.

    Example: eyJjcnYiOiJQLTM4NCIsImQiOiJyM1VFQ21naUNiNjI1c19CZWc3emdULUlCajJUOUZW...
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /access_token

    User signout

    post

    Log out current user and invalidates token

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    objectOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /signout

    Check if the user is already logged in

    get

    Check if the user is already logged in, if the user can skip login a redirect url is returned

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    loginChallengestringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /skip

    Retrieve information about server

    get

    Server software version

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /info
    Logo
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    POST /v1/auth/secrets HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 242
    
    {
      "secret": {
        "id": "s3-secret",
        "secretType": "s3",
        "expiresAt": "2025-12-29T18:02:27.140Z",
        "accessKey": "AKIAIOSFODNN7EXAMPLE",
        "params": {
          "ANY_ADDITIONAL_PROPERTY": "text"
        },
        "name": "My S3 Secret"
      },
      "secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
    }
    GET /v1/auth/secrets HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "secrets": [
        {
          "id": "s3-secret",
          "secretType": "s3",
          "expiresAt": "2025-12-29T18:02:27.140Z",
          "accessKey": "AKIAIOSFODNN7EXAMPLE",
          "params": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          },
          "name": "My S3 Secret"
        }
      ]
    }
    DELETE /v1/auth/secrets/{secretType}/{id} HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    {
      "user": {
        "id": "acc2e66f-fa31-4e73-9c49-eedee36fcf32",
        "createdAt": "2020-01-01T00:00:00Z",
        "lastLogin": "2020-01-01T00:00:00Z",
        "displayName": "John Doe",
        "email": "[email protected]",
        "settings": {},
        "photoUrl": "https://example.com/photo.jpg",
        "providerId": "google",
        "emailVerified": true,
        "customClaims": {
          "role": "admin"
        },
        "role": "ROLE_NONE",
        "firstName": "John",
        "lastName": "Doe",
        "contactInfo": {
          "company": "ByteNite",
          "jobTitle": "Software Engineer",
          "phoneNumber": "1234567890",
          "address1": "1234 Main St",
          "address2": "Apt 123",
          "city": "San Francisco",
          "state": "CA",
          "zip": "94107",
          "country": "United States"
        },
        "disabled": false,
        "isOnboarded": true,
        "onboardingInfo": [
          {
            "step": 1,
            "answer": {}
          }
        ],
        "userName": "johndoe"
      }
    }
    GET /v1/auth/user HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "user": {
        "id": "acc2e66f-fa31-4e73-9c49-eedee36fcf32",
        "createdAt": "2020-01-01T00:00:00Z",
        "lastLogin": "2020-01-01T00:00:00Z",
        "displayName": "John Doe",
        "email": "[email protected]",
        "settings": {},
        "photoUrl": "https://example.com/photo.jpg",
        "providerId": "google",
        "emailVerified": true,
        "customClaims": {
          "role": "admin"
        },
        "role": "ROLE_NONE",
        "firstName": "John",
        "lastName": "Doe",
        "contactInfo": {
          "company": "ByteNite",
          "jobTitle": "Software Engineer",
          "phoneNumber": "1234567890",
          "address1": "1234 Main St",
          "address2": "Apt 123",
          "city": "San Francisco",
          "state": "CA",
          "zip": "94107",
          "country": "United States"
        },
        "disabled": false,
        "isOnboarded": true,
        "onboardingInfo": [
          {
            "step": 1,
            "answer": {}
          }
        ],
        "userName": "johndoe"
      }
    }
    PATCH /v1/auth/user HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 318
    
    {
      "contactInfo": {
        "company": "ByteNite",
        "jobTitle": "Software Engineer",
        "phoneNumber": "1234567890",
        "address1": "1234 Main St",
        "address2": "Apt 123",
        "city": "San Francisco",
        "state": "CA",
        "zip": "94107",
        "country": "United States"
      },
      "firstName": "John",
      "lastName": "Doe",
      "userName": "johndoe",
      "onboardingInfo": [
        {
          "step": 1,
          "answer": {}
        }
      ]
    }
    GET /v1/auth/api_keys HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "apiKeys": [
        {
          "id": "acc2e66f-fa31-4e73-9c49-eedee36fcf32",
          "name": "My API key",
          "issuedAt": "2025-12-09T19:56:17.981Z",
          "expiresAt": "2025-12-09T19:56:17.981Z",
          "userId": "acc2e66f-fa31-4e73-9c49-eedee36fcf32",
          "revoked": true,
          "fingerprint": "text"
        }
      ]
    }
    POST /v1/auth/api_keys/{id}/revoke HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    GET /v1/auth/info HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "version": {
        "major": 1,
        "minor": 0,
        "tag": 0
      }
    }
    {
      "token": "eyJjcnYiOiJQLTM4NCIsImQiOiJyM1VFQ21naUNiNjI1c19CZWc3emdULUlCajJUOUZW...",
      "expiresIn": "3600",
      "scope": "text"
    }
    POST /v1/auth/access_token HTTP/1.1
    Host: api.bytenite.com
    Content-Type: application/json
    Accept: */*
    Content-Length: 84
    
    {
      "apiKey": "eyJjcnYiOiJQLTM4NCIsImQiOiJyM1VFQ21naUNiNjI1c19CZWc3emdULUlCajJUOUZW..."
    }
    POST /v1/auth/signout HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 2
    
    {}
    GET /v1/auth/skip HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "skip": true,
      "redirectTo": "text"
    }
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }

    Run a job

    post

    Run a job

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Body
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /jobs/{jobId}/run

    Stop a running job

    post

    Abort running job (an incomplete job that is yet to start will be deleted)

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /jobs/{jobId}/abort

    Delete a job

    delete

    Delete a job

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    delete
    /jobs/{jobId}

    Listen events

    get

    Listen events

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.(streaming responses)

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /events

    Set a job datasource

    patch

    Set a job datasource

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Body
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    patch
    /jobs/{jobId}/datasource

    Set job parameters

    patch

    Set or update job specific parameters

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Body
    presetstringOptional

    [Deprecated] Preset configuration. This field is no longer in use.

    partitionerobjectOptional

    Sets parameters for the partitioning engine.

    assemblerobjectOptional

    Sets parameters for the assembling engine.

    appobjectOptional

    Sets parameters for the application..

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    patch
    /jobs/{jobId}/params

    Set a job name

    patch

    Set a job name

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Body
    stringOptionalExample: My Job
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    patch
    /jobs/{jobId}/jobname

    Set job configs

    patch

    Set or update execution parameters/configurations

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Body
    taskTimeoutinteger · int64Optional
    jobTimeoutinteger · int64Optional
    isTestJobbooleanOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    patch
    /jobs/{jobId}/configs

    Test a data source

    post

    Test and get information about a data source connection

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    listFilesbooleanOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /datasource/test

    Get job

    get

    Get job properties

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /jobs/{jobId}

    Get results

    get

    Get job results

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /jobs/{jobId}/results

    Get jobs

    get

    Get all jobs for user with optional filters

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    pagination.limitinteger · int64Optional

    Number of rows to return per page.

    pagination.offsetinteger · int64Optional

    Number of rows to skip before starting to collect the result set.

    orderBystringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /jobs

    Get jobs filtered

    post

    Get all jobs for user and filter them

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    orderBystringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /jobs/filter

    Get available job templates

    get

    Get available job templates

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    pagination.limitinteger · int64Optional

    Number of rows to return per page.

    pagination.offsetinteger · int64Optional

    Number of rows to skip before starting to collect the result set.

    orderBystringOptional

    Field to order the results by. Defaults to 'created_at'.

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /jobs/templates

    Create a new job

    post

    Create a new computing job on ByteNite.

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    namestringOptional

    Mnemonic name for the job.

    templateIdstringRequired

    Identifier of the application template used for this job.

    descriptionstringOptional

    Textual description of the job.

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /jobs

    Get the number of running tasks for the jobs

    post

    Get the number of running tasks for the jobs

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body

    Get the running tasks for the provided jobs.

    jobsIdsstring[]RequiredExample: ["a5189ec6-6658-49e6-9960-99ed15b63f4d","b1234abc-1234-5678-9101-abcdef123456"]
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /jobs/runningTasks

    Set upload completed

    patch

    Set a job local file upload completed

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    jobIdstringRequired

    The id associated with your job.

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    patch
    /jobs/{jobId}/uploadcompleted

    Get logs

    post

    Get logs for the provided filters

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    jobIdstringRequiredExample: a5189ec6-6658-49e6-9960-99ed15b63f4d
    taskIdsstring[]OptionalExample: ["a5189ec6-6658-49e6-9960-99ed15b63f4d","b1234abc-1234-5678-9101-abcdef123456"]
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /logs

    Retrieve information about server

    get

    Server software version and important messages

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /info
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    POST /v1/customer/jobs/{jobId}/run HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 60
    
    {
      "config": {
        "taskTimeout": 1,
        "jobTimeout": 1,
        "isTestJob": true
      }
    }
    POST /v1/customer/jobs/{jobId}/abort HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    DELETE /v1/customer/jobs/{jobId} HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    GET /v1/customer/events HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "result": {
        "event": "text",
        "data": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      },
      "error": {
        "code": 1,
        "message": "text",
        "details": [
          {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        ]
      }
    }
    {
      "filename": "text",
      "path": "text",
      "size": "text",
      "properties": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      },
      "tempUrl": "text",
      "files": {
        "name": "text",
        "path": "text",
        "directories": [
          {
            "name": "text",
            "path": "text",
            "directories": [
              {
                "name": "text",
                "path": "text",
                "directories": "[Circular Reference]",
                "files": [
                  {
                    "id": "text",
                    "name": "text",
                    "path": "text",
                    "size": "text"
                  }
                ]
              }
            ],
            "files": [
              {
                "id": "text",
                "name": "text",
                "path": "text",
                "size": "text"
              }
            ]
          }
        ],
        "files": [
          {
            "id": "text",
            "name": "text",
            "path": "text",
            "size": "text"
          }
        ]
      }
    }
    POST /v1/customer/datasource/test HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 124
    
    {
      "dataSource": {
        "dataSourceDescriptor": "s3",
        "params": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      },
      "listFiles": true
    }
    GET /v1/customer/jobs/templates HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      },
      "data": [
        {
          "id": "text",
          "owner": "text",
          "description": "text",
          "app": "text",
          "partitioner": "text",
          "assembler": "text"
        }
      ]
    }
    {
      "job": {
        "id": "text",
        "templateId": "text",
        "name": "text",
        "config": {
          "taskTimeout": 1,
          "jobTimeout": 1,
          "isTestJob": true
        },
        "priority": "EXECUTION_PRIORITY_UNDEFINED",
        "startAt": "2025-12-09T19:56:17.981Z",
        "submittedAt": "2025-12-09T19:56:17.981Z",
        "startedAt": "2025-12-09T19:56:17.981Z",
        "endedAt": "2025-12-09T19:56:17.981Z",
        "regions": {
          "blacklist": [
            "text"
          ],
          "whitelist": [
            "text"
          ]
        },
        "state": "JOB_STATE_NEW",
        "dataSource": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "params": {
          "preset": "text",
          "partitioner": {},
          "assembler": {},
          "app": {}
        },
        "dataDestination": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "duration": 1,
        "deletedAt": "2025-12-09T19:56:17.981Z",
        "createdAt": "2025-12-09T19:56:17.981Z",
        "paymentAmount": 1,
        "numUnitsEstimation": "text",
        "numChunks": 1,
        "errorMessage": "text",
        "description": "text",
        "stateTimestamps": {
          "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
        },
        "appId": "text",
        "templateInfo": {
          "id": "text",
          "owner": "text",
          "description": "text",
          "app": "text",
          "partitioner": "text",
          "assembler": "text"
        }
      },
      "templateInfo": {
        "id": "text",
        "owner": "text",
        "description": "text",
        "app": "text",
        "partitioner": "text",
        "assembler": "text"
      }
    }
    {
      "job": {
        "id": "text",
        "templateId": "text",
        "name": "text",
        "config": {
          "taskTimeout": 1,
          "jobTimeout": 1,
          "isTestJob": true
        },
        "priority": "EXECUTION_PRIORITY_UNDEFINED",
        "startAt": "2025-12-09T19:56:17.981Z",
        "submittedAt": "2025-12-09T19:56:17.981Z",
        "startedAt": "2025-12-09T19:56:17.981Z",
        "endedAt": "2025-12-09T19:56:17.981Z",
        "regions": {
          "blacklist": [
            "text"
          ],
          "whitelist": [
            "text"
          ]
        },
        "state": "JOB_STATE_NEW",
        "dataSource": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "params": {
          "preset": "text",
          "partitioner": {},
          "assembler": {},
          "app": {}
        },
        "dataDestination": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "duration": 1,
        "deletedAt": "2025-12-09T19:56:17.981Z",
        "createdAt": "2025-12-09T19:56:17.981Z",
        "paymentAmount": 1,
        "numUnitsEstimation": "text",
        "numChunks": 1,
        "errorMessage": "text",
        "description": "text",
        "stateTimestamps": {
          "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
        },
        "appId": "text",
        "templateInfo": {
          "id": "text",
          "owner": "text",
          "description": "text",
          "app": "text",
          "partitioner": "text",
          "assembler": "text"
        }
      },
      "templateInfo": {
        "id": "text",
        "owner": "text",
        "description": "text",
        "app": "text",
        "partitioner": "text",
        "assembler": "text"
      }
    }
    {
      "job": {
        "id": "text",
        "templateId": "text",
        "name": "text",
        "config": {
          "taskTimeout": 1,
          "jobTimeout": 1,
          "isTestJob": true
        },
        "priority": "EXECUTION_PRIORITY_UNDEFINED",
        "startAt": "2025-12-09T19:56:17.981Z",
        "submittedAt": "2025-12-09T19:56:17.981Z",
        "startedAt": "2025-12-09T19:56:17.981Z",
        "endedAt": "2025-12-09T19:56:17.981Z",
        "regions": {
          "blacklist": [
            "text"
          ],
          "whitelist": [
            "text"
          ]
        },
        "state": "JOB_STATE_NEW",
        "dataSource": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "params": {
          "preset": "text",
          "partitioner": {},
          "assembler": {},
          "app": {}
        },
        "dataDestination": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "duration": 1,
        "deletedAt": "2025-12-09T19:56:17.981Z",
        "createdAt": "2025-12-09T19:56:17.981Z",
        "paymentAmount": 1,
        "numUnitsEstimation": "text",
        "numChunks": 1,
        "errorMessage": "text",
        "description": "text",
        "stateTimestamps": {
          "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
        },
        "appId": "text",
        "templateInfo": {
          "id": "text",
          "owner": "text",
          "description": "text",
          "app": "text",
          "partitioner": "text",
          "assembler": "text"
        }
      },
      "templateInfo": {
        "id": "text",
        "owner": "text",
        "description": "text",
        "app": "text",
        "partitioner": "text",
        "assembler": "text"
      }
    }
    {
      "job": {
        "id": "text",
        "templateId": "text",
        "name": "text",
        "config": {
          "taskTimeout": 1,
          "jobTimeout": 1,
          "isTestJob": true
        },
        "priority": "EXECUTION_PRIORITY_UNDEFINED",
        "startAt": "2025-12-09T19:56:17.981Z",
        "submittedAt": "2025-12-09T19:56:17.981Z",
        "startedAt": "2025-12-09T19:56:17.981Z",
        "endedAt": "2025-12-09T19:56:17.981Z",
        "regions": {
          "blacklist": [
            "text"
          ],
          "whitelist": [
            "text"
          ]
        },
        "state": "JOB_STATE_NEW",
        "dataSource": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "params": {
          "preset": "text",
          "partitioner": {},
          "assembler": {},
          "app": {}
        },
        "dataDestination": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "duration": 1,
        "deletedAt": "2025-12-09T19:56:17.981Z",
        "createdAt": "2025-12-09T19:56:17.981Z",
        "paymentAmount": 1,
        "numUnitsEstimation": "text",
        "numChunks": 1,
        "errorMessage": "text",
        "description": "text",
        "stateTimestamps": {
          "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
        },
        "appId": "text",
        "templateInfo": {
          "id": "text",
          "owner": "text",
          "description": "text",
          "app": "text",
          "partitioner": "text",
          "assembler": "text"
        }
      },
      "templateInfo": {
        "id": "text",
        "owner": "text",
        "description": "text",
        "app": "text",
        "partitioner": "text",
        "assembler": "text"
      }
    }
    PATCH /v1/customer/jobs/{jobId}/datasource HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 218
    
    {
      "dataSource": {
        "dataSourceDescriptor": "s3",
        "params": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      },
      "dataDestination": {
        "dataSourceDescriptor": "s3",
        "params": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      }
    }
    PATCH /v1/customer/jobs/{jobId}/params HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 58
    
    {
      "preset": "text",
      "partitioner": {},
      "assembler": {},
      "app": {}
    }
    PATCH /v1/customer/jobs/{jobId}/jobname HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 8
    
    "My Job"
    PATCH /v1/customer/jobs/{jobId}/configs HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 49
    
    {
      "taskTimeout": 1,
      "jobTimeout": 1,
      "isTestJob": true
    }
    {
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      },
      "data": [
        {
          "id": "text",
          "templateId": "text",
          "name": "text",
          "config": {
            "taskTimeout": 1,
            "jobTimeout": 1,
            "isTestJob": true
          },
          "priority": "EXECUTION_PRIORITY_UNDEFINED",
          "startAt": "2025-12-09T19:56:17.981Z",
          "submittedAt": "2025-12-09T19:56:17.981Z",
          "startedAt": "2025-12-09T19:56:17.981Z",
          "endedAt": "2025-12-09T19:56:17.981Z",
          "regions": {
            "blacklist": [
              "text"
            ],
            "whitelist": [
              "text"
            ]
          },
          "state": "JOB_STATE_NEW",
          "dataSource": {
            "dataSourceDescriptor": "s3",
            "params": {
              "@type": "text",
              "ANY_ADDITIONAL_PROPERTY": "anything"
            }
          },
          "params": {
            "preset": "text",
            "partitioner": {},
            "assembler": {},
            "app": {}
          },
          "dataDestination": {
            "dataSourceDescriptor": "s3",
            "params": {
              "@type": "text",
              "ANY_ADDITIONAL_PROPERTY": "anything"
            }
          },
          "duration": 1,
          "deletedAt": "2025-12-09T19:56:17.981Z",
          "createdAt": "2025-12-09T19:56:17.981Z",
          "paymentAmount": 1,
          "numUnitsEstimation": "text",
          "numChunks": 1,
          "errorMessage": "text",
          "description": "text",
          "stateTimestamps": {
            "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
          },
          "appId": "text",
          "templateInfo": {
            "id": "text",
            "owner": "text",
            "description": "text",
            "app": "text",
            "partitioner": "text",
            "assembler": "text"
          }
        }
      ]
    }
    GET /v1/customer/jobs/{jobId} HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "job": {
        "id": "text",
        "templateId": "text",
        "name": "text",
        "config": {
          "taskTimeout": 1,
          "jobTimeout": 1,
          "isTestJob": true
        },
        "priority": "EXECUTION_PRIORITY_UNDEFINED",
        "startAt": "2025-12-09T19:56:17.981Z",
        "submittedAt": "2025-12-09T19:56:17.981Z",
        "startedAt": "2025-12-09T19:56:17.981Z",
        "endedAt": "2025-12-09T19:56:17.981Z",
        "regions": {
          "blacklist": [
            "text"
          ],
          "whitelist": [
            "text"
          ]
        },
        "state": "JOB_STATE_NEW",
        "dataSource": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "params": {
          "preset": "text",
          "partitioner": {},
          "assembler": {},
          "app": {}
        },
        "dataDestination": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "duration": 1,
        "deletedAt": "2025-12-09T19:56:17.981Z",
        "createdAt": "2025-12-09T19:56:17.981Z",
        "paymentAmount": 1,
        "numUnitsEstimation": "text",
        "numChunks": 1,
        "errorMessage": "text",
        "description": "text",
        "stateTimestamps": {
          "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
        },
        "appId": "text",
        "templateInfo": {
          "id": "text",
          "owner": "text",
          "description": "text",
          "app": "text",
          "partitioner": "text",
          "assembler": "text"
        }
      },
      "templateInfo": {
        "id": "text",
        "owner": "text",
        "description": "text",
        "app": "text",
        "partitioner": "text",
        "assembler": "text"
      }
    }
    GET /v1/customer/jobs/{jobId}/results HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "results": [
        {
          "name": "text",
          "link": "text"
        }
      ]
    }
    GET /v1/customer/jobs HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      },
      "data": [
        {
          "id": "text",
          "templateId": "text",
          "name": "text",
          "config": {
            "taskTimeout": 1,
            "jobTimeout": 1,
            "isTestJob": true
          },
          "priority": "EXECUTION_PRIORITY_UNDEFINED",
          "startAt": "2025-12-09T19:56:17.981Z",
          "submittedAt": "2025-12-09T19:56:17.981Z",
          "startedAt": "2025-12-09T19:56:17.981Z",
          "endedAt": "2025-12-09T19:56:17.981Z",
          "regions": {
            "blacklist": [
              "text"
            ],
            "whitelist": [
              "text"
            ]
          },
          "state": "JOB_STATE_NEW",
          "dataSource": {
            "dataSourceDescriptor": "s3",
            "params": {
              "@type": "text",
              "ANY_ADDITIONAL_PROPERTY": "anything"
            }
          },
          "params": {
            "preset": "text",
            "partitioner": {},
            "assembler": {},
            "app": {}
          },
          "dataDestination": {
            "dataSourceDescriptor": "s3",
            "params": {
              "@type": "text",
              "ANY_ADDITIONAL_PROPERTY": "anything"
            }
          },
          "duration": 1,
          "deletedAt": "2025-12-09T19:56:17.981Z",
          "createdAt": "2025-12-09T19:56:17.981Z",
          "paymentAmount": 1,
          "numUnitsEstimation": "text",
          "numChunks": 1,
          "errorMessage": "text",
          "description": "text",
          "stateTimestamps": {
            "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
          },
          "appId": "text",
          "templateInfo": {
            "id": "text",
            "owner": "text",
            "description": "text",
            "app": "text",
            "partitioner": "text",
            "assembler": "text"
          }
        }
      ]
    }
    POST /v1/customer/jobs/filter HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 216
    
    {
      "pagination": {
        "limit": 1,
        "offset": 1
      },
      "filters": [
        {
          "field": "text",
          "condition": "FILTER_CONDITION_EQ",
          "value": {
            "@type": "type.googleapis.com/google.protobuf.Value",
            "value": "value to filter (any type)"
          }
        }
      ],
      "orderBy": "text"
    }
    {
      "jobsRunningTasks": {
        "a5189ec6-6658-49e6-9960-99ed15b63f4d": 2,
        "b1234abc-1234-5678-9101-abcdef123456": 1
      }
    }
    POST /v1/customer/jobs/runningTasks HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 91
    
    {
      "jobsIds": [
        "a5189ec6-6658-49e6-9960-99ed15b63f4d",
        "b1234abc-1234-5678-9101-abcdef123456"
      ]
    }
    PATCH /v1/customer/jobs/{jobId}/uploadcompleted HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    GET /v1/customer/info HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "version": {
        "major": 1,
        "minor": 0,
        "tag": 0
      },
      "messages": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
    POST /v1/customer/jobs HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 55
    
    {
      "name": "My job",
      "templateId": "[email protected]"
    }
    {
      "job": {
        "id": "text",
        "templateId": "text",
        "name": "text",
        "config": {
          "taskTimeout": 1,
          "jobTimeout": 1,
          "isTestJob": true
        },
        "priority": "EXECUTION_PRIORITY_UNDEFINED",
        "startAt": "2025-12-09T19:56:17.981Z",
        "submittedAt": "2025-12-09T19:56:17.981Z",
        "startedAt": "2025-12-09T19:56:17.981Z",
        "endedAt": "2025-12-09T19:56:17.981Z",
        "regions": {
          "blacklist": [
            "text"
          ],
          "whitelist": [
            "text"
          ]
        },
        "state": "JOB_STATE_NEW",
        "dataSource": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "params": {
          "preset": "text",
          "partitioner": {},
          "assembler": {},
          "app": {}
        },
        "dataDestination": {
          "dataSourceDescriptor": "s3",
          "params": {
            "@type": "text",
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        },
        "duration": 1,
        "deletedAt": "2025-12-09T19:56:17.981Z",
        "createdAt": "2025-12-09T19:56:17.981Z",
        "paymentAmount": 1,
        "numUnitsEstimation": "text",
        "numChunks": 1,
        "errorMessage": "text",
        "description": "text",
        "stateTimestamps": {
          "ANY_ADDITIONAL_PROPERTY": "2025-12-09T19:56:17.981Z"
        },
        "appId": "text",
        "templateInfo": {
          "id": "text",
          "owner": "text",
          "description": "text",
          "app": "text",
          "partitioner": "text",
          "assembler": "text"
        }
      },
      "templateInfo": {
        "id": "text",
        "owner": "text",
        "description": "text",
        "app": "text",
        "partitioner": "text",
        "assembler": "text"
      }
    }
    POST /v1/customer/logs HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 48
    
    {
      "jobId": "238cecbf-ca05-4a79-ac62-fd89f92684ee"
    }
    {
      "partitioner": [
        {
          "log": "sample-log-message from loki",
          "timestamp": "2025-12-09T19:56:17.981Z",
          "level": "INFO",
          "container": "main"
        }
      ],
      "assembler": [
        {
          "log": "sample-log-message from loki",
          "timestamp": "2025-12-09T19:56:17.981Z",
          "level": "INFO",
          "container": "main"
        }
      ],
      "taskrunner": {
        "ANY_ADDITIONAL_PROPERTY": {
          "logs": [
            {
              "log": "sample-log-message from loki",
              "timestamp": "2025-12-09T19:56:17.981Z",
              "level": "INFO",
              "container": "main"
            }
          ]
        }
      }
    }

    Activate a distributed app

    post

    Activate a distributed app

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    appTagstringRequired

    Unique tag of the app

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /apps/{appTag}/activate

    Activate a distributed app

    post

    Activate a distributed app

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    appTagstringRequired

    Unique tag of the app

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /apps/{appTag}/deactivate

    Retrieve information about service

    get

    Server software version and important messages

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /info

    Get distributed apps

    get

    List all distributed apps created by the user.

    Use this endpoint to fetch apps created by the user.

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    orderBystringOptional

    Field name to sort apps by (e.g., createdAt).

    pagination.limitinteger · int64Optional

    Number of rows to return per page.

    pagination.offsetinteger · int64Optional

    Number of rows to skip before starting to collect the result set.

    isPublicbooleanOptional

    Filter public apps only

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /apps

    Get the latest app details

    get

    Get the latest app de

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    appTagstringRequired

    Unique tag of the app

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /apps/{appTag}

    Get status of app

    get

    Get status of app

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    appTagstringRequired

    Unique tag of the app

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /apps/{appTag}/status

    Upload a template

    post

    Upload a template to the server

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body

    The templates specific to each app are stored in this table.

    idstringOptional
    createdAtstring · date-timeOptional
    updatedAtstring · date-timeOptional
    isPublicbooleanOptional
    partitionerstringOptional
    assemblerstringOptional
    userNamestringOptional

    User name of the template owner.

    Example: alice
    descriptionstringOptional
    appstringOptional
    ownerstringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /templates

    Get a template

    get

    Get a template by id

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    idstringRequired
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /templates/{id}

    Get templates

    get

    List all templates created by the user

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    orderBystringOptional

    Field name to sort apps by (e.g., createdAt).

    pagination.limitinteger · int64Optional

    Number of rows to return per page.

    pagination.offsetinteger · int64Optional

    Number of rows to skip before starting to collect the result set.

    isPublicbooleanOptional

    Filter public templates only

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /templates

    Get download link for an app

    get

    Get download link for an app

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    appTagstringRequired

    Unique tag of the app

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /apps/{appTag}/download

    Upload an engine

    post

    Upload a engine to the server

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    engineIdstringOptional
    engineTagstringOptional
    engineDatastringOptional
    engineLinkstringOptional
    engineStatusstringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /engines

    Download an Engine

    get

    Download an Engine

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    engineTagstringRequired
    Query parameters
    engineIdstringOptional
    engineDatastringOptional
    engineLinkstringOptional
    engineStatusstringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /engines/{engineTag}/download

    Activate an Engine

    post

    Activate an Engine

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    engineTagstringRequired
    Query parameters
    engineIdstringOptional
    engineDatastringOptional
    engineLinkstringOptional
    engineStatusstringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /engines/{engineTag}/activate

    Deactivate an Engine

    post

    Deactivate an Engine

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    engineTagstringRequired
    Query parameters
    engineIdstringOptional
    engineDatastringOptional
    engineLinkstringOptional
    engineStatusstringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /engines/{engineTag}/deactivate

    Upload a distributed app

    post

    Upload a distributed app to the server

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Body
    datastringRequired
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    post
    /apps

    Get engines

    get

    List all engines owned by the user

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Query parameters
    orderBystringOptional

    Field name to sort apps by (e.g., createdAt).

    pagination.limitinteger · int64Optional

    Number of rows to return per page.

    pagination.offsetinteger · int64Optional

    Number of rows to skip before starting to collect the result set.

    isPublicbooleanOptional

    Filter public engines only

    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /engines

    Get an engine

    get

    Get an engine by tag

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    engineTagstringRequired
    Query parameters
    engineIdstringOptional
    engineDatastringOptional
    engineLinkstringOptional
    engineStatusstringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /engines/{engineTag}

    Get status of engine

    get

    Get status of engine

    Authorizations
    AuthorizationstringRequired

    Your ByteNite access token

    Path parameters
    engineTagstringRequired
    Query parameters
    engineIdstringOptional
    engineDatastringOptional
    engineLinkstringOptional
    engineStatusstringOptional
    Responses
    200

    A successful response.

    400

    Returned when the users sends a malformed request.

    401

    Returned when the user is not authenticated.

    403

    Returned when the user does not have permission to access the resource.

    404

    Returned when the resource does not exist.

    500

    Returned when an error on the server occurred.

    503

    Returned when the resource is temporarily unavailable.

    default

    An unexpected error response.

    get
    /engines/{engineTag}/status
    POST /v1/dev/apps/{appTag}/activate HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    POST /v1/dev/apps/{appTag}/deactivate HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    GET /v1/dev/info HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "version": {
        "major": 1,
        "minor": 0,
        "tag": 0
      },
      "messages": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
    GET /v1/dev/apps HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "apps": [
        {
          "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "name": "video-transcoding",
          "version": "1.0",
          "owner": "b7aac91d-7e62-4923-898f-5c6d9ea48927",
          "status": "active",
          "deviceRequirements": {
            "minCpu": 1,
            "minMemory": 2,
            "gpu": [
              "tesla t4",
              "nvidia a100-sxm4-40gb"
            ]
          },
          "isPublic": true,
          "createdAt": "2025-12-09T19:56:17.981Z",
          "updatedAt": "2025-12-09T19:56:17.981Z",
          "platform": "docker",
          "hash": "Plv5qqtm1jPtm8Brq4jMj9u/zSJMQV85fl62UNxltcM=",
          "link": "text",
          "platformConfig": {
            "container": "python:latest",
            "privateImage": true,
            "username": "text",
            "token": "text",
            "secrets": [
              "text"
            ]
          },
          "entrypoint": "main.py",
          "revision": "text",
          "description": "text",
          "userName": "alice"
        }
      ],
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      }
    }
    GET /v1/dev/apps/{appTag} HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "app": {
        "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "name": "video-transcoding",
        "version": "1.0",
        "owner": "b7aac91d-7e62-4923-898f-5c6d9ea48927",
        "status": "active",
        "deviceRequirements": {
          "minCpu": 1,
          "minMemory": 2,
          "gpu": [
            "tesla t4",
            "nvidia a100-sxm4-40gb"
          ]
        },
        "isPublic": true,
        "createdAt": "2025-12-09T19:56:17.981Z",
        "updatedAt": "2025-12-09T19:56:17.981Z",
        "platform": "docker",
        "hash": "Plv5qqtm1jPtm8Brq4jMj9u/zSJMQV85fl62UNxltcM=",
        "link": "text",
        "platformConfig": {
          "container": "python:latest",
          "privateImage": true,
          "username": "text",
          "token": "text",
          "secrets": [
            "text"
          ]
        },
        "entrypoint": "main.py",
        "revision": "text",
        "description": "text",
        "userName": "alice"
      }
    }
    GET /v1/dev/apps/{appTag}/status HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    POST /v1/dev/templates HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 562
    
    {
      "id": "text",
      "createdAt": "2025-12-09T19:56:17.981Z",
      "updatedAt": "2025-12-09T19:56:17.981Z",
      "isPublic": true,
      "partitioner": "text",
      "assembler": "text",
      "dataSource": {
        "dataSourceDescriptor": "s3",
        "params": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      },
      "dataDestination": {
        "dataSourceDescriptor": "s3",
        "params": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      },
      "params": {
        "partitioner": {},
        "app": {},
        "assembler": {}
      },
      "config": {
        "taskTimeout": 1,
        "jobTimeout": 1,
        "isTestJob": true,
        "maxTaskRetries": 1
      },
      "userName": "alice",
      "description": "text",
      "app": "text",
      "owner": "text"
    }
    GET /v1/dev/templates/{id} HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "id": "text",
      "createdAt": "2025-12-09T19:56:17.981Z",
      "updatedAt": "2025-12-09T19:56:17.981Z",
      "isPublic": true,
      "partitioner": "text",
      "assembler": "text",
      "dataSource": {
        "dataSourceDescriptor": "s3",
        "params": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      },
      "dataDestination": {
        "dataSourceDescriptor": "s3",
        "params": {
          "@type": "text",
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      },
      "params": {
        "partitioner": {},
        "app": {},
        "assembler": {}
      },
      "config": {
        "taskTimeout": 1,
        "jobTimeout": 1,
        "isTestJob": true,
        "maxTaskRetries": 1
      },
      "userName": "alice",
      "description": "text",
      "app": "text",
      "owner": "text"
    }
    GET /v1/dev/templates HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "templates": [
        {
          "id": "text",
          "createdAt": "2025-12-09T19:56:17.981Z",
          "updatedAt": "2025-12-09T19:56:17.981Z",
          "isPublic": true,
          "partitioner": "text",
          "assembler": "text",
          "dataSource": {
            "dataSourceDescriptor": "s3",
            "params": {
              "@type": "text",
              "ANY_ADDITIONAL_PROPERTY": "anything"
            }
          },
          "dataDestination": {
            "dataSourceDescriptor": "s3",
            "params": {
              "@type": "text",
              "ANY_ADDITIONAL_PROPERTY": "anything"
            }
          },
          "params": {
            "partitioner": {},
            "app": {},
            "assembler": {}
          },
          "config": {
            "taskTimeout": 1,
            "jobTimeout": 1,
            "isTestJob": true,
            "maxTaskRetries": 1
          },
          "userName": "alice",
          "description": "text",
          "app": "text",
          "owner": "text"
        }
      ],
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      }
    }
    GET /v1/dev/apps/{appTag}/download HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "ok": false,
      "requestId": "xyz-123",
      "message": "Request  failed",
      "error": {
        "code": 404,
        "message": "Not Found",
        "description": "The requested resource was not found"
      }
    }
    POST /v1/dev/engines HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "id": "text",
      "name": "text",
      "version": "text",
      "owner": "text",
      "type": "text",
      "status": "text",
      "description": "text",
      "hash": "text",
      "link": "text",
      "entrypoint": "text",
      "revision": 1,
      "createdAt": "2025-12-09T19:56:17.981Z",
      "updatedAt": "2025-12-09T19:56:17.981Z",
      "deletedAt": "2025-12-09T19:56:17.981Z",
      "platform": "text",
      "platformConfig": {
        "container": "python:latest",
        "privateImage": true,
        "username": "text",
        "token": "text",
        "secrets": [
          "text"
        ]
      },
      "deviceRequirements": {
        "minCpu": 1,
        "minMemory": 2,
        "gpu": [
          "tesla t4",
          "nvidia a100-sxm4-40gb"
        ]
      },
      "isPublic": true,
      "userName": "alice"
    }
    GET /v1/dev/engines/{engineTag}/download HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "engineId": "text",
      "engineTag": "text",
      "engineData": "text",
      "engineLink": "text",
      "engineStatus": "text"
    }
    POST /v1/dev/engines/{engineTag}/activate HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "engineId": "text",
      "engineTag": "text",
      "engineData": "text",
      "engineLink": "text",
      "engineStatus": "text"
    }
    POST /v1/dev/engines/{engineTag}/deactivate HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "engineId": "text",
      "engineTag": "text",
      "engineData": "text",
      "engineLink": "text",
      "engineStatus": "text"
    }
    GET /v1/dev/engines HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "engines": [
        {
          "id": "text",
          "name": "text",
          "version": "text",
          "owner": "text",
          "type": "text",
          "status": "text",
          "description": "text",
          "hash": "text",
          "link": "text",
          "entrypoint": "text",
          "revision": 1,
          "createdAt": "2025-12-09T19:56:17.981Z",
          "updatedAt": "2025-12-09T19:56:17.981Z",
          "deletedAt": "2025-12-09T19:56:17.981Z",
          "platform": "text",
          "platformConfig": {
            "container": "python:latest",
            "privateImage": true,
            "username": "text",
            "token": "text",
            "secrets": [
              "text"
            ]
          },
          "deviceRequirements": {
            "minCpu": 1,
            "minMemory": 2,
            "gpu": [
              "tesla t4",
              "nvidia a100-sxm4-40gb"
            ]
          },
          "isPublic": true,
          "userName": "alice"
        }
      ],
      "pagination": {
        "total": 1,
        "offset": 1,
        "hasPrevious": true,
        "hasNext": true
      }
    }
    GET /v1/dev/engines/{engineTag} HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "id": "text",
      "name": "text",
      "version": "text",
      "owner": "text",
      "type": "text",
      "status": "text",
      "description": "text",
      "hash": "text",
      "link": "text",
      "entrypoint": "text",
      "revision": 1,
      "createdAt": "2025-12-09T19:56:17.981Z",
      "updatedAt": "2025-12-09T19:56:17.981Z",
      "deletedAt": "2025-12-09T19:56:17.981Z",
      "platform": "text",
      "platformConfig": {
        "container": "python:latest",
        "privateImage": true,
        "username": "text",
        "token": "text",
        "secrets": [
          "text"
        ]
      },
      "deviceRequirements": {
        "minCpu": 1,
        "minMemory": 2,
        "gpu": [
          "tesla t4",
          "nvidia a100-sxm4-40gb"
        ]
      },
      "isPublic": true,
      "userName": "alice"
    }
    GET /v1/dev/engines/{engineTag}/status HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Accept: */*
    
    {
      "engineId": "text",
      "engineTag": "text",
      "engineData": "text",
      "engineLink": "text",
      "engineStatus": "text"
    }
    POST /v1/dev/apps HTTP/1.1
    Host: api.bytenite.com
    Authorization: YOUR_API_KEY
    Content-Type: application/json
    Accept: */*
    Content-Length: 15
    
    {
      "data": "text"
    }
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "name": "video-transcoding",
      "version": "1.0",
      "owner": "b7aac91d-7e62-4923-898f-5c6d9ea48927",
      "status": "active",
      "deviceRequirements": {
        "minCpu": 1,
        "minMemory": 2,
        "gpu": [
          "tesla t4",
          "nvidia a100-sxm4-40gb"
        ]
      },
      "isPublic": true,
      "createdAt": "2025-12-09T19:56:17.981Z",
      "updatedAt": "2025-12-09T19:56:17.981Z",
      "platform": "docker",
      "hash": "Plv5qqtm1jPtm8Brq4jMj9u/zSJMQV85fl62UNxltcM=",
      "link": "text",
      "platformConfig": {
        "container": "python:latest",
        "privateImage": true,
        "username": "text",
        "token": "text",
        "secrets": [
          "text"
        ]
      },
      "entrypoint": "main.py",
      "revision": "text",
      "description": "text",
      "userName": "alice"
    }