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")

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

etiket_sdk-0.3.0b3-cp314-cp314-win_amd64.whl (429.7 kB view details)

Uploaded CPython 3.14Windows x86-64

etiket_sdk-0.3.0b3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b3-cp314-cp314-macosx_11_0_x86_64.whl (462.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

etiket_sdk-0.3.0b3-cp314-cp314-macosx_11_0_arm64.whl (430.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

etiket_sdk-0.3.0b3-cp313-cp313-win_amd64.whl (420.0 kB view details)

Uploaded CPython 3.13Windows x86-64

etiket_sdk-0.3.0b3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b3-cp313-cp313-macosx_11_0_x86_64.whl (463.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

etiket_sdk-0.3.0b3-cp313-cp313-macosx_11_0_arm64.whl (428.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

etiket_sdk-0.3.0b3-cp312-cp312-win_amd64.whl (431.3 kB view details)

Uploaded CPython 3.12Windows x86-64

etiket_sdk-0.3.0b3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b3-cp312-cp312-macosx_11_0_x86_64.whl (468.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

etiket_sdk-0.3.0b3-cp312-cp312-macosx_11_0_arm64.whl (436.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

etiket_sdk-0.3.0b3-cp311-cp311-win_amd64.whl (433.4 kB view details)

Uploaded CPython 3.11Windows x86-64

etiket_sdk-0.3.0b3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b3-cp311-cp311-macosx_11_0_x86_64.whl (465.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

etiket_sdk-0.3.0b3-cp311-cp311-macosx_11_0_arm64.whl (440.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

etiket_sdk-0.3.0b3-cp310-cp310-win_amd64.whl (434.0 kB view details)

Uploaded CPython 3.10Windows x86-64

etiket_sdk-0.3.0b3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

etiket_sdk-0.3.0b3-cp310-cp310-macosx_11_0_x86_64.whl (466.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

etiket_sdk-0.3.0b3-cp310-cp310-macosx_11_0_arm64.whl (443.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file etiket_sdk-0.3.0b3-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2ee9e94539f79a68136c62a2c91ea08fef9bf66f8b23cbc41d28fd7e32672378
MD5 0262f53a00f7696b9b126c03cbc4c1f4
BLAKE2b-256 462aac4f700456e4f954101740b85a4ee9d0133d548e18d64cf3a0eac0322c58

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6f072f39667c48ebd1647769e465bebdc5be005be404712c56d832c8d5ac0ee7
MD5 9fa79bc53aa0ba8559103b94d4f5b2a3
BLAKE2b-256 d2e2b57d38c5090b04f5afd673319591b54816e472d6bfe232acec5f24f6e09c

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 0e311ba3aca544cdb014a7f080047a185053b7e3a45d2f561d26c5145a739446
MD5 417bd8827ecfbcdd86ef216303e19f66
BLAKE2b-256 a80131c2b9d3295df83dc99c36eab8a7b27faf284a3ce379a590f6b048972090

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 003ae1f5a72be66eeb40fbad4f60151dc681198a98b0b9f3d4000ffeed7650a6
MD5 8a6d963c2409cb000fd83d74f7337eef
BLAKE2b-256 5e5f6d6f96322c31e91cd4c59c37012a7ee818c672785616a05e8f79d5d4229d

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 09407404ffa220c977ec1544a21edeafc6b45bad4b259a5f6f10762f901ebfb0
MD5 a200d7669a23517eb3b180278ef8966a
BLAKE2b-256 2ca1d76b1025627a10d402165981ae976e848c82b58c6c6b37794cc240076dfd

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e88151d3310f98f5370784efe046a761df3489c7a7dbb1a0e909bf0545d0b737
MD5 cfb973081b6d07158435366fcb56e9fc
BLAKE2b-256 34863a75378afdecb5640ff37d9d5f0ae9775fffe70711ccff1eae82966e4436

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 bef53232c7f05400594ced0b2288a4f5564488e1c80fd840f70404a32d346ffc
MD5 a1147a4c4a9522546407b1028beab6cf
BLAKE2b-256 7166353c9243fc1c5ce75c28abf0926fcd3f705377f9d6bf15602268bec05f37

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee12784dce56fe18d4d81d884b80dd406cdcce86cb3967f2f206656fa2acbf13
MD5 3e232f2d3ebff7ad5779b9037e108271
BLAKE2b-256 e9bee015726feafd0c5280d9acc8b0889a179aa19cafd74467c98211ea1d6a80

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ea1951a73c8fd7cace482882e595f7fa463b2f545702f2319cfa2530908c6d38
MD5 656f8e6df7af159aea6875f4f4fb1afd
BLAKE2b-256 de49ab0bd56b46c750c8b4d3ed99458f22427b4db51f5d5d943008ab380d6c8d

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2d2e2bc89024638b3d11b73d54919d4174ec67bae3ca1929aa0663b10a2353ae
MD5 bc60845073281e3e736c4ebbf66e3833
BLAKE2b-256 4600d5563b466474725ea0616d3323e40b634722bed43c6207fa8d12426bea8e

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 691eb733516c839f03994f7649d87ab22fafc478704c9dcb63235dac265f2867
MD5 9d46b7c7aca54751e6c4ea4f2296a46c
BLAKE2b-256 8cb03247c9807085588010769aaf67db5f90882caeb0a7c3fc654edab12577b6

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fc36968f6f01f8f08480cd6d846608441c62baf61ce04bd76092e22e0d0ae667
MD5 8dcb161b33b68887f150c942ab219ebf
BLAKE2b-256 5bc171a4a3bbf1f0aeb5efaa3ed23f5a5f5838354b418f11d905ee06f78d57cf

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 14e9724eeb698430323effdaec4691cbf3ae28cbb091f014aa42b5653184027e
MD5 4f11802463fa3e921f19aed209d69fb0
BLAKE2b-256 e3cd62d23dc6809ba2a62d61f57e3b7f01fb85e661b2ead2bc46f3f6b9b5ac0b

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9ee0943d57f4d060c3a959ef2e85b5e7e70ab80f6804cf2de0098d6a6050324b
MD5 b035493ce58ef1530260679ddbe8e731
BLAKE2b-256 8d166f2ce319b095ff3fa5f464f23b9f1102fdd6c3f87e5ca19c41c0b7833aa1

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 8257dad05c415cd09ad520e0138d71406038737a570c9143936d9c6c1e1f711c
MD5 c7ad7e40eca6aa6f153935f06479e835
BLAKE2b-256 36c6956dbfb290bf8ebbe5e15998c248ff54d41dba8d85e71620dc2c23a151b9

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4878582f4e855dc27e9bea23cf9310c2459c4f20b0e401a82344798b134b7a9
MD5 b11e8bae3e1af7ab05bd6dceaf81ce13
BLAKE2b-256 34596f7b25521b08e253040a39e9bdb6276361994ea97ad0adb481ed202946e1

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8d4daa485ac9d1757bd03ac6388494be5b11568770a66dc37c2df42989e5c6d6
MD5 f214366504c327b9b033f82986c5c957
BLAKE2b-256 37770fe34b7a113a3c63a07f4a4753afb6eee85682d0087135642e5b6ff924fb

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 faf812a65feecd42b4c177babaf83cd288967c956c7fd9bd7162b57acf9a83ae
MD5 c73bba393505b86108fad01aff9468f4
BLAKE2b-256 8d1cd1017c8133d68f55d34bb47a88af6a5102a5d891f5872d477422bcb35890

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6ce05ff2af61c2414af9f7737064462611ac3f8862fc99d59c0d420d0f70a2fc
MD5 2a3dcda67a4d544046d99c302797faeb
BLAKE2b-256 097e37b3089bec032a6f87e8019ca052a9a69466707880fe15e60aa2ff0af8dc

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 01fe003cc052da96eca1d7ed0d832f661ef1a0506f5f72f594d6b1a588841899
MD5 93c4492ecaf118ce105e646a6d9f12ba
BLAKE2b-256 204c2e33a3295f7061e054687d0c2507737dfa8d50ba39da0eb1ec2f6cef414b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page