Skip to main content

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

Metadata

Release files for etiket-sdk 0.3.2

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.2
File Actions
etiket_sdk-0.3.2-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details for etiket_sdk-0.3.2-cp314-cp314-win_amd64.whl
etiket_sdk-0.3.2-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 for etiket_sdk-0.3.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 11.0+ x86-64 Details for etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_x86_64.whl
etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details for etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_arm64.whl
etiket_sdk-0.3.2-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for etiket_sdk-0.3.2-cp313-cp313-win_amd64.whl
etiket_sdk-0.3.2-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 for etiket_sdk-0.3.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 11.0+ x86-64 Details for etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_x86_64.whl
etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details for etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_arm64.whl
etiket_sdk-0.3.2-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details for etiket_sdk-0.3.2-cp312-cp312-win_amd64.whl
etiket_sdk-0.3.2-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 for etiket_sdk-0.3.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 11.0+ x86-64 Details for etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_x86_64.whl
etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details for etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_arm64.whl
etiket_sdk-0.3.2-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for etiket_sdk-0.3.2-cp311-cp311-win_amd64.whl
etiket_sdk-0.3.2-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 for etiket_sdk-0.3.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
etiket_sdk-0.3.2-cp311-cp311-macosx_11_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 11.0+ x86-64 Details for etiket_sdk-0.3.2-cp311-cp311-macosx_11_0_x86_64.whl
etiket_sdk-0.3.2-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details for etiket_sdk-0.3.2-cp311-cp311-macosx_11_0_arm64.whl
etiket_sdk-0.3.2-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details for etiket_sdk-0.3.2-cp310-cp310-win_amd64.whl
etiket_sdk-0.3.2-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 for etiket_sdk-0.3.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
etiket_sdk-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 11.0+ x86-64 Details for etiket_sdk-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl
etiket_sdk-0.3.2-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details for etiket_sdk-0.3.2-cp310-cp310-macosx_11_0_arm64.whl

Total release size: 19.6 MB

Release files / etiket_sdk-0.3.2-cp314-cp314-win_amd64.whl

Download URL etiket_sdk-0.3.2-cp314-cp314-win_amd64.whl
Size 428.3 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
4717e2e4f07ceed4441c6b8cd6af45bc8ecd38a0b3269f5f91e3c8dc544017f6
BLAKE2b-256 checksum
How to use checksums
1893a1b97b8e172f4b3b8245fe357bcac3138bcb6994ddbeb7bcc2072ee795e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.2-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
a933b8916a84dbbe88b1049f499755a3cc2c9644b5f8739f2229b532c29722d7
BLAKE2b-256 checksum
How to use checksums
e6d5c644245a4fdfd931507a1f766639c58ad015e5b89b18b1810d966b36b59a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_x86_64.whl
Size 470.4 kB
Tags CPython 3.14 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
3b43f00eca1485c6137241425e6059f3a3fa5c6d8312d36b5328a4c26bf6d56b
BLAKE2b-256 checksum
How to use checksums
ab0a11f6aa2411311a28400828c372b7ec886861d748cc6f27db7050c8729ef8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.2-cp314-cp314-macosx_11_0_arm64.whl
Size 436.0 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0fa216eb8373dceaae8c207d9fedade1d479284b6a4c7c55a380994fcd965a23
BLAKE2b-256 checksum
How to use checksums
362a2bb58a194c4112dcbeb3466be51640cb8f6599c92c7ee99297ce14e43a5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp313-cp313-win_amd64.whl

Download URL etiket_sdk-0.3.2-cp313-cp313-win_amd64.whl
Size 417.4 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
a8714ca1ec41d6e0d80106530beef076e46af9f52c10a176c3c134d25cf0c02b
BLAKE2b-256 checksum
How to use checksums
67a4da0286f85d4096cfeea0065edb556b1dc1f7e76bcdec6c0018c84d3f524a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.2-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
8ef3f820b69d5850404727ec217c7d618660b3b2e1fa77c3b6f9b899d1177c54
BLAKE2b-256 checksum
How to use checksums
f3104f84c5fa8413b037c185715ec4e96029ded31e12f957d2aa56017e104251
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_x86_64.whl
Size 470.8 kB
Tags CPython 3.13 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
5daf317a694c494217766ff96bc4968a5fc5ca6413de270db0fcd399b524ee2f
BLAKE2b-256 checksum
How to use checksums
e60759da9567f691958435a0c8f0cb20bce1e9231312d5a1959d7f5841cdd32b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.2-cp313-cp313-macosx_11_0_arm64.whl
Size 434.1 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d12363900651a4acb40fa648a878e784e63de4bb6a6562948c22b897ee57f648
BLAKE2b-256 checksum
How to use checksums
07e0fcbc31e903459cf5328e5d9ce499c41da418b19ab706d10d1bee17fb1525
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp312-cp312-win_amd64.whl

Download URL etiket_sdk-0.3.2-cp312-cp312-win_amd64.whl
Size 428.0 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
bbf24a756b3f146f03c3ff57f3090eabcc5fba00e30c29b54803eef459458436
BLAKE2b-256 checksum
How to use checksums
59a4f291555594ab4dfbe60964b28b8fac6aa33ad999029f5495ad4ba4689f9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.2-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
d6bd3f12f07c7cd1f03ef4439638ddd9e0bcfe29953cb2a61c986b081bd6e5f6
BLAKE2b-256 checksum
How to use checksums
ae890407d24f20dd15ba457ef2f1976819535043d502ab389e32be863e838fa3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_x86_64.whl
Size 477.4 kB
Tags CPython 3.12 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
1e3dbd802516925616aeba3e7fee08c5b5c58e426540ec77d4b89293984be9ce
BLAKE2b-256 checksum
How to use checksums
9f57945f830589a972804ad8608fe5e19264b14014c9f98f2bc91b2b37eebb5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.2-cp312-cp312-macosx_11_0_arm64.whl
Size 441.8 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7ad3c032e66ff37aff2c93a2f2e39938cc68b2ce39899ab2a5203579dd33e99f
BLAKE2b-256 checksum
How to use checksums
b4a936462e4cd6fef01cbf213889194904e844d721e91a2f048f38017becccaa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp311-cp311-win_amd64.whl

Download URL etiket_sdk-0.3.2-cp311-cp311-win_amd64.whl
Size 436.7 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
bb31cb576448b44d6ebe9c84f4916f839afe97bcbe29ae17106460e76db754cc
BLAKE2b-256 checksum
How to use checksums
1caffe1653f0a1296930b2fdff1c0df7ee66003baa552b5a36cffc7ecf340484
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.2-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
c8f7dbf91204ffca6baabf6fd0532bc170a183b63f539841f233fa1d72d17b6c
BLAKE2b-256 checksum
How to use checksums
68e57be727849b9b9945adac95460f18eee147b0fec82b0ae7f5097c41d77e33
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp311-cp311-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.2-cp311-cp311-macosx_11_0_x86_64.whl
Size 464.6 kB
Tags CPython 3.11 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
77111fdef7c75830b88f782a2f9462a8d5adc9ab059071e346c8269ffc724a13
BLAKE2b-256 checksum
How to use checksums
de04bbb93f1ac1d683f30b56d365081b019d7c6863ff29cd9b9faef3f936fa9a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp311-cp311-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.2-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
9fd1154811742643b10bcd0400e32e4d7e4ada40ba8f6b84c851a8bf688929c1
BLAKE2b-256 checksum
How to use checksums
1bdb71b7c50bee39c3c73b5289aa8a066969e91a627f1c049984752cd953e3bc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp310-cp310-win_amd64.whl

Download URL etiket_sdk-0.3.2-cp310-cp310-win_amd64.whl
Size 442.0 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
053159bd04a66aa7f673c91fc0c88bcdf2cd9c63abc653a8a0a940823fd9093d
BLAKE2b-256 checksum
How to use checksums
39818daa3b2ce77297b7b8c45372b7acbd8768080b3e3953fb61801269619cfa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL etiket_sdk-0.3.2-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
17c2ea2d4bd1103332426d935b7a9ec9bf273ebfb1965df9169446c543ac4985
BLAKE2b-256 checksum
How to use checksums
f5b121b499472bc0fdf9c2179d5aecae27e5c4231c623c5209f8ebb2d8d90f6d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl

Download URL etiket_sdk-0.3.2-cp310-cp310-macosx_11_0_x86_64.whl
Size 470.3 kB
Tags CPython 3.10 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
361129342ec7f38fb68d9201d6e479078b4e4cc72160c645f5a79c864b4ec611
BLAKE2b-256 checksum
How to use checksums
3ef58e0b6859c3f1fedd16880067ec628f8b6e75174930566a8f6241854878df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / etiket_sdk-0.3.2-cp310-cp310-macosx_11_0_arm64.whl

Download URL etiket_sdk-0.3.2-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
184d27836796909ad3cb561872c1e85100767adf3a7576ec11bd99af337b1c59
BLAKE2b-256 checksum
How to use checksums
14a9d3c748a79de179da949f82d94ffc1278d3090359ad03a4245316ac22d68d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Security for etiket-sdk 0.3.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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