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.0b4-cp314-cp314-win_amd64.whl (429.7 kB view details)

Uploaded CPython 3.14Windows x86-64

etiket_sdk-0.3.0b4-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.0b4-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.0b4-cp314-cp314-macosx_11_0_arm64.whl (430.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

etiket_sdk-0.3.0b4-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.0b4-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.0b4-cp313-cp313-macosx_11_0_arm64.whl (428.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

etiket_sdk-0.3.0b4-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.0b4-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.0b4-cp312-cp312-macosx_11_0_arm64.whl (436.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

etiket_sdk-0.3.0b4-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.0b4-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.0b4-cp311-cp311-macosx_11_0_arm64.whl (440.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

etiket_sdk-0.3.0b4-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.0b4-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.0b4-cp310-cp310-macosx_11_0_arm64.whl (443.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6461357d4a38f258f2f9ea43a26ffc4553f99b924f52cbbfcd242e39882cbdb7
MD5 51fa146d66ac4a171e8178928cd1f3f0
BLAKE2b-256 f04fbff9510853be1c3da337f43a105f9cb402262efd8488537329c9cb296cc9

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b4-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.0b4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6f1a743313c8a5460e4d8fd99778e8d0c6addbc7dfb2497055730a660b7c62a0
MD5 81c583ca2aceb47f35818b918a541afe
BLAKE2b-256 100e6aebd3f3264363cf96db21040876eb54f2ca4dff557db56916b385cdc6bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 e18280290cd272f4136b3dc602e91863ba83d2cccb17a767f695d018a6b1c737
MD5 6460851e9249afe02db4c26465a82807
BLAKE2b-256 f638488463f6de62d63f7b42ca352f2f4f4f00d9cb31d9783f38bc3d2f5c71a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1ecfbd40403fa7fe9fa111178cef4f87b2de3541b1af82ddffd26f25c67f91f
MD5 c992c4990c7f012700962b2dda5686fb
BLAKE2b-256 fd7be5404facff721ddbd1997c85d7e3ee200fcfdadebca72387b28a10c95440

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 35d64515393b20e32a1534ef30eb25ba8ab2eabff6987a2badf973c160342813
MD5 ec8477101b0f84aa51cd07b95c4a486b
BLAKE2b-256 f6b35de9cbfc4270ff719076c560de5474bb21436860de5fd52e21ac67605ba7

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b4-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.0b4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ad05ad284106ac334ee15c78aef8437825688434398f293274c5e4382328f234
MD5 2f248336fa3a934793a2dc86945ca137
BLAKE2b-256 24cb6efcf6813c2fe4080688ad9bf50d45621333c7d7fb7bd22f967dc5bdc177

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 5fe2ff716bff33bef0bdcedf765e7fa54598cf3c2059cccce1e1fca725efcbaa
MD5 618c061154fe88bfe135aa8610ebb781
BLAKE2b-256 c190d6036378c1df55b34d0dc4991987894fff1a686d2bd8f3b8f11f24fb9b98

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 00cf321780b4eae1112550ab01555661beae4f8b7887a18048ef9b452cdbabc1
MD5 096258150728a4846778d903e8fced7d
BLAKE2b-256 aace9e1a4494b1c9e116857b265bf4fded9107a5b69e44e5224dd2c533f97607

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 194354dcdad738b00f30734064a94c25db5436cce0e16ceb9d6bd2318b2410ba
MD5 d5e8843e0cffc9a425e997209c07cfcb
BLAKE2b-256 bf1595c32af4959ae3de4745f096cf1eab31aaf8a9d6ea4f1946d2e855582d23

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b4-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.0b4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5bae57b2e84d70c772b1a2abb600a9bc81fcd2cc3a920220936ff34308186b3f
MD5 f5f654ff03f16badba6afae34041afea
BLAKE2b-256 4a605a2dacbaafde9467ed298917a02af632941409d907629ff215441d9dd992

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 60d227b475f6be9aef4dcc46e68e50560e350eb04291c07ee617c6ff092af3e1
MD5 44183212de7f16ce8eadb6f172eb004a
BLAKE2b-256 241ca2ecf84e85455636a99803f46a735d1848b9080acf1ad324fa9e85ca05bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b674c7e267c03031c6ea197fb0986e062125111c137ce5ab0ad1e191efc2bc4c
MD5 74f99d01a799ca2b97c4f586b66a0460
BLAKE2b-256 c0c3268b799a3e497566cd1a6f9de7c73cd20a008c37c051084a1004bedf2e52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 208bca937bfac8d1b0478654b416053f463f09b1398cdb36724b2aaaed11f0c1
MD5 277f1d4619a6ca5359a6f5274f67329b
BLAKE2b-256 930f4df53b876a2a8afe3eeed25fe847750293d649c5f9842e47af5bb0d19781

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b4-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.0b4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2704d4eb2b04d7b2f10dd2926213790c8ffa2939410109571c456e4f5a06f07f
MD5 87ec320cf5518ca3a98185b8db132899
BLAKE2b-256 638b86ac8e850cc6272228ee13957678687dfab625f99b3afdc5dd1845139904

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6abb6c50dd91a8c3b27319345860ee439b96bcc4db8a4876c80e2ef325ab512e
MD5 58d21c19afd2a885d4674f18bb8e76df
BLAKE2b-256 d384270deb65e407542a69a4bfa8783cebee519638649f3b322bf0be0fd699d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3092887aca31ef7e27a84b79c9db16e845290cdbc76b2b970e68940a0958a2b
MD5 3615898bd0f51d14ae3187dec243814a
BLAKE2b-256 622d4c03dc2dccd16f1a53ae21f2896bc78f7d3f817dd3d8a708272bfa2551a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6410a68290e22af106d9f2c952002f5672be34e4081e614a12212fed0bd48265
MD5 d631d924c3a538fcd7a0ac1414e4165e
BLAKE2b-256 93233ae6856fb57f6baf17626224f74e88a85b32c6bb44ccc9252d6d35159627

See more details on using hashes here.

File details

Details for the file etiket_sdk-0.3.0b4-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.0b4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d78509b782c265f4ec998e6f2ccab4bed87cb06cf7cc60cf03dcd529419dc7d9
MD5 93a03a3ca5342b00eb94b99618be69fe
BLAKE2b-256 0da24bf473375dc7be75e83e8af1bbfc637879bc36df5bdb22eafaea8a525cbd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c993a36f07cb484455082aebd03a2a09301c078f9107200d224f9e11861300c5
MD5 b9841372fadf671b8690c2f2c6316ac2
BLAKE2b-256 8b26962fe26a83fd06bd33f01c296b1b05cb944ad0a4464490d76883799952a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for etiket_sdk-0.3.0b4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b4745cf8225c399fad12c2b23f5140808a680f0dc4e5c04919759f53c749b4e7
MD5 48579893547b2a54b06b09299e890ee4
BLAKE2b-256 fc62a4de4d7297c95218aa7e95a2d37f68e2428722cc79e92c6488edcba42396

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