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.0b6

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.0b6
File
etiket_sdk-0.3.0b6-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
etiket_sdk-0.3.0b6-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.0b6-cp314-cp314-macosx_11_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b6-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b6-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
etiket_sdk-0.3.0b6-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.17+ x86-64, Linux glibc 2.28+ x86-64 Details
etiket_sdk-0.3.0b6-cp313-cp313-macosx_11_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b6-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b6-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
etiket_sdk-0.3.0b6-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.0b6-cp312-cp312-macosx_11_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b6-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b6-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
etiket_sdk-0.3.0b6-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.17+ x86-64, Linux glibc 2.28+ x86-64 Details
etiket_sdk-0.3.0b6-cp311-cp311-macosx_11_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b6-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
etiket_sdk-0.3.0b6-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
etiket_sdk-0.3.0b6-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.17+ x86-64, Linux glibc 2.28+ x86-64 Details
etiket_sdk-0.3.0b6-cp310-cp310-macosx_11_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 11.0+ x86-64 Details
etiket_sdk-0.3.0b6-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 19.6 MB

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

Download URL etiket_sdk-0.3.0b6-cp314-cp314-win_amd64.whl
Size 428.0 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
bc552b733bb0636483845358a27ddc364689bbef1d85a5556e8a0e3ca25e1104
BLAKE2b-256 checksum
How to use checksums
1bb835c9a19e21fc52687642b60dc476054efc6a1f802d13e9c48c9c17ceffa4
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.0b6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 2.6 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
01b39e638f7c128a234e171b45c104650410cd2864a9d05abbdb7c371238122b
BLAKE2b-256 checksum
How to use checksums
9b24d86248eb6fd342cf01e06eab54af33adf0ddfc7eaab75c9123938e761752
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.0b6-cp314-cp314-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b6-cp314-cp314-macosx_11_0_x86_64.whl
Size 470.1 kB
Tags CPython 3.14 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
213d78df9358b271f687e00f18e8f2f56f4a650aa4e8fe0dc364c2eb691309cd
BLAKE2b-256 checksum
How to use checksums
85f1962f6aad87e1a1403d2d8e8af0c9a0d78af502bc1689826d83fee4af84c1
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.0b6-cp314-cp314-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b6-cp314-cp314-macosx_11_0_arm64.whl
Size 435.8 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
aaf29ab74dd971c5e4acb99a67ab3166bf84bd766b8c478662c2cfe392a2d7af
BLAKE2b-256 checksum
How to use checksums
a5a349460e781a62467e7d783168236686e298763da4ad354aec9d9909784263
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.0b6-cp313-cp313-win_amd64.whl

Download URL etiket_sdk-0.3.0b6-cp313-cp313-win_amd64.whl
Size 417.2 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
d98db2f0f17e736cf233f4e9b669fc1d65e2dadbe95fbb29cbef2bb87953fcdc
BLAKE2b-256 checksum
How to use checksums
df5cf6a03bb1f8d56d759ba033bdfc09a6f5459ec63a9d9950cc582f73f9e182
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.0b6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 2.6 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
16381854296d95bf5407fe6515a7afbc6be3d5afbe4820056dddaa0a22f35c2e
BLAKE2b-256 checksum
How to use checksums
509d04bc6cc8197d560543a13f66f7e3a659501b13db5e152795069a03cf2b75
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.0b6-cp313-cp313-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b6-cp313-cp313-macosx_11_0_x86_64.whl
Size 470.6 kB
Tags CPython 3.13 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
8068df9620906bd0c9ecce7dff79df6a063bfd42636399ab4c7fbfb57410bd94
BLAKE2b-256 checksum
How to use checksums
9e874f1fbc6fbe41bd5e76c75a7546c54c63c1053a147a69a8103361ef7c4e37
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.0b6-cp313-cp313-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b6-cp313-cp313-macosx_11_0_arm64.whl
Size 433.9 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
236b6568f51875b986ba1988a3de96dccb2b40934a103f43b6e806fe8c82510c
BLAKE2b-256 checksum
How to use checksums
23687fcab7f73ed4e5cd04a50580b470c4eb0918043ee25b631c591ba6823d0e
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.0b6-cp312-cp312-win_amd64.whl

Download URL etiket_sdk-0.3.0b6-cp312-cp312-win_amd64.whl
Size 427.7 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
0c5824d9a7d32bd9f1e70316d272bdb113e1e55cda91a939d10223271f8a169c
BLAKE2b-256 checksum
How to use checksums
8f5dc8eb91b944f2cd518f91d92b19bbad26576d43bb3d0ca544cde6e0cc533b
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.0b6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b6-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
86d8c1d4227fe694988e7109602c0f83924035c4b29e8f59d765f77d6f763121
BLAKE2b-256 checksum
How to use checksums
4f1d52a2cdd2983f5d148e3fe7dc558aaf8d044a86d21c3b122cd45744143050
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.0b6-cp312-cp312-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b6-cp312-cp312-macosx_11_0_x86_64.whl
Size 477.1 kB
Tags CPython 3.12 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
c5cdd604701d1e7908cf403251f6887c0f98f2a148e262f7304eb748336d21b4
BLAKE2b-256 checksum
How to use checksums
5fb4b5a7132e9663d0639ba39c53ce9fb67c0fbc60423a962d9d7eca99ed05f6
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.0b6-cp312-cp312-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b6-cp312-cp312-macosx_11_0_arm64.whl
Size 441.7 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
62e17307e5103c0b8093d9a823f957deb186462b4bd2f14db5daba94586784e0
BLAKE2b-256 checksum
How to use checksums
d7dd716ca472bb757b386fa3608c42d3f9c177dda0d3cc445d449d61f84d6f67
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.0b6-cp311-cp311-win_amd64.whl

Download URL etiket_sdk-0.3.0b6-cp311-cp311-win_amd64.whl
Size 436.2 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
4b8933637c8bf1eca153bbf182b25f3216ddbe88918811742ac66afa2b223df5
BLAKE2b-256 checksum
How to use checksums
69d25a530471658ce228bc90a87bb408fad1167c0f9b23bb034bc0569d9cc5dc
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.0b6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b6-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
2c46e707bc3c595a9fad087a664c8f5c07d2e17647dd60f0f7e8085ac86bbb0f
BLAKE2b-256 checksum
How to use checksums
1e38713f605a3908a422a1e0f90e387c453701e226a4cf290fc9833bb4fa4a8a
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.0b6-cp311-cp311-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b6-cp311-cp311-macosx_11_0_x86_64.whl
Size 464.4 kB
Tags CPython 3.11 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
0a901965d1c3b88a62281975ed9e552cb5240378a54e4b8e5966657b237d958f
BLAKE2b-256 checksum
How to use checksums
b4037f36ca3d066d8f45abb215b890d216b6d3b66bd719743dc6c920c8ec2bfe
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.0b6-cp311-cp311-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b6-cp311-cp311-macosx_11_0_arm64.whl
Size 439.9 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
151c114ad046074ce700e482ca06c8b615afb1a2a9317f3dd2ed761cfa8fbe1c
BLAKE2b-256 checksum
How to use checksums
5053cf9294c555907d52db9cd0a3c3d696b6ba7d1fce35cb7064809e433696f8
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.0b6-cp310-cp310-win_amd64.whl

Download URL etiket_sdk-0.3.0b6-cp310-cp310-win_amd64.whl
Size 441.7 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
9ece9fc28ea3d2b262aff68158f28d5678828ad417c2d55ffff00fc0614e84d4
BLAKE2b-256 checksum
How to use checksums
3be26a1d077fc899352eb99620bd03de620ab949a1ecfdc68aeb72fe94d1b53c
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.0b6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.0b6-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
3758116d6e72a9cc44305445959692fbb94bb4706bce1fa3be7ebd69f55bce37
BLAKE2b-256 checksum
How to use checksums
65ce0cac921f2bc91253056c992a58358e6d25e01c0d174f8418f6e46bd4faff
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.0b6-cp310-cp310-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.0b6-cp310-cp310-macosx_11_0_x86_64.whl
Size 470.1 kB
Tags CPython 3.10 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
2f4bcc8487f50fc348e3da1a3b078cb47596356c6b987d32f5b8b43208294938
BLAKE2b-256 checksum
How to use checksums
e390c05b5d66a2b04a022894b0e5d72b72bc8c4cf73244ff5f232b36e86a7dd7
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.0b6-cp310-cp310-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.0b6-cp310-cp310-macosx_11_0_arm64.whl
Size 445.8 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
cb774e3fafdf7d3b4cc4de41748d235c6005737e1caecc7339fa4460862de019
BLAKE2b-256 checksum
How to use checksums
85bb68bb9394a4ed38d364452eaacfda29ac2392a34d06249712babfc3fa03bf
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