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

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

Total release size: 19.6 MB

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

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

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

Download URL etiket_sdk-0.3.0-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
642fe47ec5a2f0ab02bf53415cd157f3003c87d821ee5c573325a201dfce4b29
BLAKE2b-256 checksum
How to use checksums
b052a329bd4c6b7fd2e5a83252b23c80f7b22070d2e7d4c054583055b973c822
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Download URL etiket_sdk-0.3.0-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
6c63a1f72e008abec913170a1fbff64964998c546de51f6eddf17e7c2e6b0e19
BLAKE2b-256 checksum
How to use checksums
4e7300fcf9ba2b2a28c60b26677672b2a6910f96ee6f702aa8ce45814722d501
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

Download URL etiket_sdk-0.3.0-cp311-cp311-win_amd64.whl
Size 436.3 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
35ac5f6b957f5ef7e4e9f365ed01203b4080ea313250d75ddbb7ee0897ccd2fc
BLAKE2b-256 checksum
How to use checksums
0d427548ecd2757c37807fd3d4f2308fde3ac04dfe762ecb832d0ea3005b7803
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL etiket_sdk-0.3.0-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
4a74b5d742246d7ddeefc0afcf9b2b6d8239a149299e5097423910605ce3adff
BLAKE2b-256 checksum
How to use checksums
91a3ede299baeeda01573ecc3fd6aacc0394f808285d230414dfa67f24744c35
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

Download URL etiket_sdk-0.3.0-cp310-cp310-win_amd64.whl
Size 441.8 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
24d49158f307271a2e566a4f60e725732d1f796b35a441ee55208a9d3c4d5943
BLAKE2b-256 checksum
How to use checksums
0969cafc6ed03dcc765ffde61b8f283d4f38ccab75fa83484b06f4f807ee92dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

Download URL etiket_sdk-0.3.0-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
4b315ce4c14c9b605b35b1165b37f565ddb7732872cdf51588a8b2e7316f0728
BLAKE2b-256 checksum
How to use checksums
88539188f965e92b0408ee5ed03d0e4745a5ad5e37855a5546364e75c5e46aac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for etiket-sdk 0.3.0

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