Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

eTiKeT SDK

Python SDK for the eTiKeT platform. The Sync Agent runs as a background service on your computer, automatically synchronizing your experimental data to qHarbor. This SDK allows you to easily interact with the Sync Agent and manage your sync sources.

Installation

pip install etiket-sdk

Sync Agent

The SyncAgent class provides methods to check the status of the background sync service, start and stop it, and view recent errors. For more information about debugging, see the Debugging section.

Checking Status

from etiket_sdk.sync import SyncAgent

# Get the current status
status = SyncAgent.status()
print(status)

Output:

Sync Agent Status:
  Agent Service: running
  API Service: running
  Agent Status: running
  Iterations: 142
  Last Update: 2025-12-16 10:30:00

The status shows:

  • Agent Service: Whether the sync agent service is installed and running
  • API Service: Whether the sync API service is running (the service that allows the SDK to interact with the Sync Agent)
  • Agent Status: Current state (running, stopped, no_connection, unavailable). When the sync agent is not running, the API service is not available.
  • Iterations: Number of sync cycles completed
  • Last Update: When the status was last updated

Starting and Stopping

# Stop the sync agent
SyncAgent.stop()

# Start the sync agent
SyncAgent.start()

Viewing Errors

If sync isn't working, check for agent-level errors. Note: always check the timestamps to see if errors are recent.

# Get recent errors
errors = SyncAgent.errors()
for error in errors:
    print(error)

# Or fetch only the unread inbox
unread = SyncAgent.errors(viewed=False)

Errors carry a viewed flag so you can acknowledge what you've already triaged:

# Mark a single error as viewed (or unviewed)
unread[0].mark_viewed()

# Bulk-acknowledge — returns the count of rows actually flipped
flipped = SyncAgent.mark_all_errors_viewed()

These are system-level errors that block sync from running entirely (e.g., not logged in, no network connection).


Sync Sources

A Sync Source defines where data comes from and how it should be synchronized. Each source uses a connector that knows how to read data from a specific format (e.g., QCoDeS, Quantify, or a folder of files).

Listing Sources

from etiket_sdk.sync import SyncSources

# List all configured sync sources
sources = SyncSources.list()
print(sources)

Output:

['QH datasets' (connector='etiket_sync_agent_native'), 'my_sync_source' (connector='etiket_sync_agent_folderbase')]

This lists all configured sync sources. Use SyncSources.get(name) to get full details for a specific source.

Getting Source Details

# Get a specific source by name
source = SyncSources.get("my_sync_source")
print(source)

Output:

SyncSource: my_sync_source
  id: 2
  connector: etiket_sync_agent_folderbase
  status: scanning
  items: 28/28 synced, 0 failed
  last_update: 2025-12-15 14:54:00

The output shows sync progress at a glance.

Viewing Source Errors

When the sync source is unable to run because of an error, the status will be error. You can fetch and view errors for a source:

source = SyncSources.get("my_source")
source.print_errors()

# Filter by viewed flag — pass viewed=False to print only unread errors
source.print_errors(viewed=False)

Errors carry a viewed flag so you can acknowledge what you've already triaged:

unread = source.errors(viewed=False)
unread[0].mark_viewed()                # mark one
unread[0].mark_viewed(viewed=False)    # un-view if you change your mind

# Bulk-acknowledge — returns the count of rows actually flipped
flipped = source.mark_all_errors_viewed()

Listing Available Connectors

Before creating a source, see what connectors are available:

# List connector identifiers
print(SyncSources.connectors())
# ['etiket_sync_agent_folderbase', 'etiket_sync_agent_quantify', 'etiket_sync_agent_qcodes', ...]

# Get details for a specific connector
connector = SyncSources.connector("etiket_sync_agent_folderbase")
print(connector)

Generating a Create Example

Each connector can generate a copy-paste ready example:

SyncSources.connector("etiket_sync_agent_folderbase").example()

Output:

# Copy-paste this example to create a sync source:
SyncSources.create(
    name="my_folderbase_source",
    connector_identifier="etiket_sync_agent_folderbase",
    config_data={
        "root_directory": "<path to folder>",
        "is_server_folder": False,
    },
)

Creating a Sync Source

from etiket_sdk.sync import SyncSources

source = SyncSources.create(
    name="my_folderbase_source",
    connector_identifier="etiket_sync_agent_folderbase",
    config_data={
        "root_directory": "~/Downloads/MyData",
        "is_server_folder": False,
    },
    default_scope="6c319227-f6f8-4bc6-b7f9-ed278a8fb040",
)

Scope Options:

The default_scope and autoassign_scope_mapping options depend on the connector:

  • Required default scope (e.g., FolderBase): The default_scope must be provided. All items sync to this scope.

  • Optional/No default scope (e.g., core_tools, QCoDeS): Items may have scope identifiers that need to be mapped to scopes. Use autoassign_scope_mapping=True to automatically match identifiers to scope names:

source = SyncSources.create(
    name="my_coretools_source",
    connector_identifier="etiket_sync_agent_coretools",
    config_data={"db_path": "/path/to/db"},
    autoassign_scope_mapping=True,  # auto-map identifiers to scopes
)

See Scope Mappings for more details on managing scope mappings.

Updating a Sync Source

source = SyncSources.get("my_source")

# Rename a source
source.update(rename_to="new_name")

# Update configuration
source.update(config_data={"is_server_folder": True})

Note: Some configuration changes may require a sync agent restart to take effect.

Deleting a Sync Source

source = SyncSources.get("my_source")
source.delete()

Source Ownership

Some connectors (e.g. those that need a per-user API token to upload) attach an owner to each sync source — that's the user whose stored credentials get used for uploads. You can check, claim, or release ownership from the SDK:

source = SyncSources.get("my_source")
print(source.owner)            # the current owner's user_sub, or None

# Claim ownership for the currently logged-in user. 
source.take_ownership()

# Release current ownership.
source.release_ownership()

release_ownership() is idempotent — calling it on an already-unowned source is a no-op. Connectors that don't have an owner concept (e.g. etiket_sync_agent_native) will reject take_ownership() with SyncSourceConnectorHasNoOwner:

from etiket_sdk.sync import SyncSourceConnectorHasNoOwner

try:
    source.take_ownership()
except SyncSourceConnectorHasNoOwner:
    print("This connector doesn't support per-user ownership")

Starting and Stopping Sync Sources

You can pause and resume individual sync sources without affecting others:

source = SyncSources.get("my_source")

# Stop a running sync source
source.stop()

# Start a stopped sync source
source.start()

Status transitions:

  • Start: Changes status from stopped or error to syncing. Raises SyncSourceAlreadyRunning if the source is already syncing or scanning.
  • Stop: Changes status from syncing, scanning, or error to stopped. Raises SyncSourceAlreadyStopped if the source is already stopped.
from etiket_sdk.sync import (
    SyncSourceAlreadyRunning,
    SyncSourceAlreadyStopped,
)

source = SyncSources.get("my_source")

try:
    source.start()
except SyncSourceAlreadyRunning:
    print("Source is already running!")

try:
    source.stop()
except SyncSourceAlreadyStopped:
    print("Source is already stopped!")

Resetting Sync Items

If many items have failed and you want to retry them all at once (instead of resetting each individually), you can reset all failed sync items for a source:

source = SyncSources.get("my_source")

# Reset only failed items (retry them)
count = source.reset_sync_items()
print(f"Reset {count} failed items")

# Reset ALL items (including successful ones, forcing re-sync)
count = source.reset_sync_items(include_successful=True)
print(f"Reset {count} items")

This is useful when:

  • Multiple items failed due to a temporary issue (e.g. permissions, ...)
  • You need to re-sync everything after changing the default scope
  • You want to force a full re-sync of all data

Reporting Errors

If something isn't working, you can send an error report to qHarbor support:

source = SyncSources.get("my_source")
source.report_error("Sync keeps failing with permission denied")

Scope Mappings

For sync sources that don't have a required default scope (like core_tools), sync items may have scope identifiers (project names, etc.) that need to be mapped to specific scopes in qHarbor. This allows items from different folders to be synced to different scopes.

Note: If your sync source has a required default scope, all items are synced to that scope and mappings are not needed.

Enabling Auto-Assign:

When creating or updating a sync source, you can enable automatic scope mapping. When enabled, the sync agent will automatically create mappings for identifiers that match exactly one scope name (case-insensitive):

# Enable auto-assign when creating a source
source = SyncSources.create(
    name="my_source",
    connector_identifier="etiket_sync_agent_folderbase",
    config_data={"root_directory": "/data", "is_server_folder": False},
    autoassign_scope_mapping=True,  # Enable automatic scope mapping
)

# Or enable it on an existing source
source = SyncSources.get("my_source")
source.update(autoassign_scope_mapping=True)

Viewing Current Mappings:

source = SyncSources.get("my_source")

# View existing mappings
for mapping in source.scope_mappings:
    print(f"{mapping.scope_identifier} -> {mapping.scope_uuid}")

# Check how many items need mapping
print(f"Items needing mapping: {source.items_unmapped_scope_count}")

Finding Unmapped Identifiers:

source = SyncSources.get("my_source")
unmapped = source.unmapped_identifiers()
print(f"Need mapping: {unmapped}")
# ['scope_A', 'scope_B', ...]

Manual Auto-Assign:

If autoassign_scope_mapping is not enabled on the source, you can manually trigger auto-assignment. This creates mappings for identifiers that match exactly one scope name (case-insensitive):

source = SyncSources.get("my_source")
count = source.autoassign_mappings()
print(f"Created {count} mappings automatically")

Note: When autoassign_scope_mapping=True is set on the sync source, this happens automatically during each sync cycle, so manual calls are not needed.

Manual Mapping Management:

For identifiers that don't match a scope name or match multiple scopes, you can create mappings manually:

import uuid

source = SyncSources.get("my_source")

# Create a new mapping
source.create_mapping(
    scope_identifier="scope_A",
    scope_uuid=uuid.UUID("12345678-1234-1234-1234-123456789abc"),
)

# Update an existing mapping
source.update_mapping(
    scope_identifier="scope_A",
    scope_uuid=uuid.UUID("87654321-4321-4321-4321-cba987654321"),
)

# Delete a mapping
source.delete_mapping(scope_identifier="scope_A")

Handling Mapping Errors:

from etiket_sdk.sync import (
    ScopeMappingNotFound,
    ScopeMappingAlreadyExists,
    ScopeMappingInvalidScope,
)

source = SyncSources.get("my_source")

try:
    source.create_mapping("scope_A", some_uuid)
except ScopeMappingAlreadyExists:
    print("Mapping already exists - use update_mapping instead")
except ScopeMappingInvalidScope:
    print("The target scope UUID doesn't exist")

Sync Items

A Sync Item represents a single dataset that needs to be synchronized. Sync items are automatically created when the sync agent scans your sources.

Listing Items

from etiket_sdk.sync import SyncSources

source = SyncSources.get("my_source")

# List all items for a source
items = source.items()
for item in items:
    print(item)

# Filter by sync status
failed_items = source.items(is_synchronized=False)

# Search by data identifier
items = source.items(query="measurement_2024")

Getting Item Details

source = SyncSources.get("my_source")

# Get a specific item by ID
item = source.item(123)
print(item)

# View the sync record with detailed logs
print(item.sync_record)

Prioritizing an Item

If you need an item to sync immediately:

source = SyncSources.get("my_source")
item = source.item(123)
item.prioritize()

Resetting a Failed Item

If an item failed and you want to retry:

source = SyncSources.get("my_source")
item = source.item(123)
item.reset()

This clears the attempt counter and marks it for retry.

Reporting Errors

source = SyncSources.get("my_source")
item = source.item(123)
item.report_error("This file keeps failing to upload")

Connectors

In the Sync Sources section, we used connectors to create sync sources. The Connectors class lets you manage installed connector packages — install new ones, update existing ones, or uninstall them.

Connectors are implementations that know how to synchronize data from specific data acquisition software. We provide pre-built connectors for popular packages:

Connector Package Description
etiket_sync_agent_qcodes QCoDeS Sync QCoDeS datasets
etiket_sync_agent_quantify Quantify Sync Quantify datasets
etiket_sync_agent_labber Labber Sync Labber log files
etiket_sync_agent_coretools Core Tools Sync Core Tools datasets
etiket_sync_agent_folderbase FolderBase Sync files from a folder

Installing Connectors

from etiket_sdk.sync import Connectors

# List installed connectors
print(Connectors.list())

# Get a specific connector and print its details
connector = Connectors.get("etiket_sync_agent_qcodes")
print(connector)

# Install from PyPI
Connectors.install_from_pypi("etiket-sync-agent-qcodes")

# Install a specific version
Connectors.install_from_pypi("qcodes", version="0.45.0")

# Install from local development path
Connectors.install_from_local("/path/to/my-connector")

# Install in editable mode (for development)
Connectors.install_from_local("/path/to/my-connector", editable=True)

# Update a connector
Connectors.update_from_pypi("etiket-sync-agent-qcodes")

# Uninstall a connector
Connectors.uninstall("etiket_sync_agent_qcodes")

You can also create your own connectors. See the Connector Development Guide for more information.


Converters

Converters automatically transform files from one format to another during sync. For example, you can convert CSV files to HDF5 so they can be plotted automatically in qHarbor.

Converters are supported when using the FolderBase connector.

Installing Converters

from etiket_sdk.sync import Converters

# List installed converters
print(Converters.list())

# Get a specific converter and print its details
converter = Converters.get("my_converter")
print(converter)

# Install from PyPI
Converters.install_from_pypi("my-converter-package")

# Install from local development path
Converters.install_from_local("/path/to/my-converter")

# Update a converter
Converters.update_from_pypi("my-converter-package")

# Uninstall a converter
Converters.uninstall("my_converter")

For information on creating your own converters, see the Converter Development Guide.


Debugging

When sync isn't working, errors are caught at three levels. Debug from top to bottom:

1. Sync Agent Errors

These are system-level errors that block sync entirely (e.g., not logged in, no network).

from etiket_sdk.sync import SyncAgent

# Check if the agent is running
status = SyncAgent.status()
print(status)

# If not running or status shows issues, check errors
errors = SyncAgent.errors()
for error in errors:
    print(error)

2. Sync Source Errors

These are source-level errors that prevent items from being discovered or processed.

from etiket_sdk.sync import SyncSources

# Check the source status
source = SyncSources.get("my_source")
print(source)  # Shows status and item counts

# View recent errors
source.print_errors()

Look for:

  • Configuration errors
  • Connector connection issues
  • Permission problems

3. Sync Item Errors

These are item-level errors that occur while syncing individual items.

from etiket_sdk.sync import SyncSources

source = SyncSources.get("my_source")

# List failed items
failed = source.items(is_synchronized=False)
for item in failed:
    print(item)

# Get detailed error info for a specific item
item = source.item(123)
print(item.sync_record)  # Shows detailed logs and errors

Debugging Workflow

  1. Start at the top: Check SyncAgent.status() — is it running? Any login or network issues?
  2. Check agent errors: SyncAgent.errors() — any agent-level errors?
  3. Check source status: SyncSources.get("name") — is the source in an error state?
  4. Check source errors: source.print_errors() — any configuration issues?
  5. Check failed items: source.items(is_synchronized=False) — which items failed?
  6. Get item details: source.item(id).sync_record — what went wrong?

Reporting Issues

If you can't resolve an issue, send an error report to qHarbor support. This sends an automatic email to qHarbor support with error details attached:

# Report agent issues
SyncAgent.report_error("Sync agent keeps crashing on startup")

# Report source issues
source = SyncSources.get("my_source")
source.report_error("Sync keeps failing with permission denied")

# Report item issues
item = source.item(123)
item.report_error("This file always fails to upload")

Admin / Logs

Both local services (sync API and sync agent) write to a rotating log file in the shared data directory. The SDK exposes them via the Logs class so you don't need to know where they live on disk.

from etiket_sdk.admin import Logs, LogService

# Last 500 records of the API service log
for line in Logs.tail(LogService.api, n=500):
    print(line)

# Full sync-agent log (current file plus the rotation backup, up to ~20 MB)
all_lines = Logs.tail(LogService.sync_agent, n=-1)

n counts logical records, not physical lines: multi-line entries (e.g. stack traces) come back as a single string with embedded \n, so a tail request will never slice through the middle of a traceback.

Raises LogFileNotFound if the requested service hasn't run yet (its log file doesn't exist on disk).


Configuration

By default, the SDK connects to the local sync service at localhost:10410. You can change this if needed (though this is generally not necessary):

from etiket_sdk._client import EtiketClient

# Configure once at application startup
EtiketClient.configure(base_url="http://my-server:10410")

Release files for etiket-sdk 0.3.0b5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for etiket-sdk 0.3.0b5
File
etiket_sdk-0.3.0b5-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
etiket_sdk-0.3.0b5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
etiket_sdk-0.3.0b5-cp314-cp314-macosx_11_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b5-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b5-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
etiket_sdk-0.3.0b5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.17+ x86-64 Details
etiket_sdk-0.3.0b5-cp313-cp313-macosx_11_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b5-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b5-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
etiket_sdk-0.3.0b5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
etiket_sdk-0.3.0b5-cp312-cp312-macosx_11_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b5-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b5-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
etiket_sdk-0.3.0b5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.17+ x86-64 Details
etiket_sdk-0.3.0b5-cp311-cp311-macosx_11_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b5-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b5-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
etiket_sdk-0.3.0b5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.17+ x86-64 Details
etiket_sdk-0.3.0b5-cp310-cp310-macosx_11_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b5-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 19.2 MB

Release files / etiket_sdk-0.3.0b5-cp314-cp314-win_amd64.whl

Download URL etiket_sdk-0.3.0b5-cp314-cp314-win_amd64.whl
Size 429.7 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
12c2f753fa9b24ed1c452bc06b39f8e4a2e8fb3cd7fbc6d8ad4acef4c42cc58a
BLAKE2b-256 checksum
How to use checksums
523bc0241c2ba9694208d8f23c4a5f6ab41fec6f1757d89b3ca709c193131633
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 2.5 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
78d27cdd3daf8ede862896a56d82b1fa288b4832f136ccb87acfe0bff9b0be79
BLAKE2b-256 checksum
How to use checksums
69321db1eee471a10e09fc9ef4ba3687ba2ac47f660ef44ba96f24b263eea142
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp314-cp314-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp314-cp314-macosx_11_0_x86_64.whl
Size 462.8 kB
Tags CPython 3.14 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
3c232c669fcb31cb9186d1c9ab023fb9e78e842bd60e1bf1514d73c008f253bf
BLAKE2b-256 checksum
How to use checksums
2ec7ef207b8bfb9b750677390578d58458cc4bbc9453b42ff04346eb2681173b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp314-cp314-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b5-cp314-cp314-macosx_11_0_arm64.whl
Size 430.8 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b91f6d0109a07fa58f5a46ceaae075e1d09671a7394f0dadbdc369a6847996e1
BLAKE2b-256 checksum
How to use checksums
e0121003dbb4d6ecdaaffb4b3f198955b85523252854c7bd131869f6fcdf99f1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp313-cp313-win_amd64.whl

Download URL etiket_sdk-0.3.0b5-cp313-cp313-win_amd64.whl
Size 420.0 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
953e9b4e3365ebea29ad58d071fa655640c804411b656b3c8d47d26a16e100e8
BLAKE2b-256 checksum
How to use checksums
db281acc9cda8d3fd7c803816cf89e7d819c42bd3526f98443a94b0618c68e0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 2.5 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
50048aa98f1f80ddd863ba2a13e4709c14b135d3159b89998582ebd02d8eaa52
BLAKE2b-256 checksum
How to use checksums
65526caff3c6505e1bf4a6570d2d42da1f0294ed2d7d20da77fa1a6bb58f6ddc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp313-cp313-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp313-cp313-macosx_11_0_x86_64.whl
Size 463.6 kB
Tags CPython 3.13 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
8b3b0fa40589cc72b4b4b326103634777c6f01ace27a64a5feac9cc658762566
BLAKE2b-256 checksum
How to use checksums
061e294c93d4e310140d514cd5644d286f349269a274ffc7299f027a3ae3618a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp313-cp313-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b5-cp313-cp313-macosx_11_0_arm64.whl
Size 428.7 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9d3a366aa75a8aa1b16bad48d5977625548d01744b30381f0293585a307bd243
BLAKE2b-256 checksum
How to use checksums
daf65d62b1b144e6c76784529a82c6d09dd25106cf093af87a4022e874a58560
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp312-cp312-win_amd64.whl

Download URL etiket_sdk-0.3.0b5-cp312-cp312-win_amd64.whl
Size 431.3 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
a8d7d8b53dc31dcfb68e61bb69fca0a50e09bd2133904cfbe941da09cea51961
BLAKE2b-256 checksum
How to use checksums
63aa75a46b9b94a8c5242dd92100ff3ad2d43f044861708cbea132aee971fa28
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 2.7 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
647d72f92f7de911239db2670ee7fe114fdc54db1621599fb1d58c908a2a9b4f
BLAKE2b-256 checksum
How to use checksums
ff910cc9c516b2573ae7581b30437b0f4985646e96ca7d2d9448d0d99aec9ffa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp312-cp312-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp312-cp312-macosx_11_0_x86_64.whl
Size 468.8 kB
Tags CPython 3.12 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
47894e07178b07c7a49910698f20d868dd7825c02006d0ef4b958bd7357095b2
BLAKE2b-256 checksum
How to use checksums
bddcf4683af36a2a765ca256de0eee41abf698cf4de0d2cf9b0b9835bb35fd88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp312-cp312-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b5-cp312-cp312-macosx_11_0_arm64.whl
Size 436.0 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a561c5f3dfe7dce2e804dcaa9d5225cc9879577cc63e388d344311403e4daf36
BLAKE2b-256 checksum
How to use checksums
2e506f68abe1f1f2c1002b5b421013d0a6fd1ddd1f6cbdb939e66094e0f6f2fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp311-cp311-win_amd64.whl

Download URL etiket_sdk-0.3.0b5-cp311-cp311-win_amd64.whl
Size 433.4 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
95aab9ec7eae30b1f99e0eac7570634f03741b069c6324bcb456fc518cb04b1a
BLAKE2b-256 checksum
How to use checksums
98be87a8d9cc0359c0ad019b876513d5bef5162b8a6a8d8744d7f83165145348
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 2.5 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
bd371425a387f038ac93dc36134d6a137d5f0619c2f6a807429c722134fb65c3
BLAKE2b-256 checksum
How to use checksums
bf3833050d5f4691c4c1d55ae0cc63ca9a9dc7c5c1d116d8c5588be639d0aad3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp311-cp311-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp311-cp311-macosx_11_0_x86_64.whl
Size 465.1 kB
Tags CPython 3.11 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
cf2ee630cf03ffc09ad1557b68376acb08d07446a769fe70c5cd97a13c0cf875
BLAKE2b-256 checksum
How to use checksums
48a3e6e35a57e08b82a0d622ae984f626c09763ff76178049bdf63be2d96ca31
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp311-cp311-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b5-cp311-cp311-macosx_11_0_arm64.whl
Size 440.6 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a8aa7132055eb3e710bdcd0da8fce38d1612d37a3cc062c3d3a8bca9a171c4da
BLAKE2b-256 checksum
How to use checksums
26510d15d18026ca96c82f5d248c9cea4fcf27153b24243add33b1316738222d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp310-cp310-win_amd64.whl

Download URL etiket_sdk-0.3.0b5-cp310-cp310-win_amd64.whl
Size 434.0 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
56befaa517b9f35182ff1025faa928604c5b30d51e0fb7fffc690638cd1d4fb3
BLAKE2b-256 checksum
How to use checksums
5dea0c94bc5761c3bbbd7ae429e9ac25303dcd52d3904b13a794eb32fd88fa49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 2.4 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
f3a29fd94813a6d5d6ba25f9246c7377e9218fcc9551b9a1540da76b9cd5be59
BLAKE2b-256 checksum
How to use checksums
2cb594920a2f2ccb6c793dc335267dd8cb6c511ab4561c5c538b788692138c8c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp310-cp310-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b5-cp310-cp310-macosx_11_0_x86_64.whl
Size 466.9 kB
Tags CPython 3.10 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
14568eb16f85aadb5ac0a159cbbad97409f5e6d5206d2811ff6b4ebd879331f6
BLAKE2b-256 checksum
How to use checksums
f3067f8aee293585eb44528664727124eb73a35531453c289f134312b501d180
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / etiket_sdk-0.3.0b5-cp310-cp310-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b5-cp310-cp310-macosx_11_0_arm64.whl
Size 443.0 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c6ccafc44f2994c887323d64bfe39ffa15abcbf45939341bea7c11ba2c2528e0
BLAKE2b-256 checksum
How to use checksums
a5b4f40e1b06c31d2d587cb991d564be60eb842123875cd48c2d3f799dd8ec08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page