Skip to main content

REST and Python API for the eTiKeT platform

Project description

eTiKeT API

REST and Python API for the eTiKeT platform. This package provides the local API service that allows external tools (like the eTiKeT SDK) to interact with the sync agent and manage local authentication.

Overview

The eTiKeT API runs as a local service. It provides:

  • REST API: HTTP endpoints for authentication, sync management, and more
  • Python API: Direct Python functions for internal use

Note: Most users should use the eTiKeT SDK instead of calling this API directly. The SDK provides a simpler, higher-level interface.

Installation

pip install etiket-api

Running the Service

Normally, the sync API runs as a system service in the background (managed by the eTiKeT installer). However, you can run it manually for development or debugging:

python3.11 -m etiket_api

By default, the service runs on http://localhost:10410. The interactive API documentation is available at http://localhost:10410/docs (Swagger UI).


REST API Overview

The REST API is available at http://localhost:10410/api/v1/. Interactive API documentation is available at http://localhost:10410/docs (Swagger UI).

Local API Tokens

Manage API tokens stored on this machine. Tokens allow background sync to authenticate with the server without an active login session.

Method Endpoint Description
POST /auth/local/api-tokens Create a new API token for the current user
GET /auth/local/api-tokens List all locally stored API tokens
DELETE /auth/local/api-tokens/{uid} Revoke a token on the server and delete it locally
GET /auth/local/api-tokens/{uid}/check Check if a token is still valid

Sync Agent

Manage the background sync agent service.

Method Endpoint Description
GET /sync/agent/status Get current sync agent status
GET /sync/agent/errors Get sync agent errors (paginated, optional viewed filter)
PATCH /sync/agent/errors/{error_id} Update a sync-agent error record (currently only the viewed flag)
POST /sync/agent/errors/mark-all-viewed Mark all sync-agent errors as viewed. Returns the number flipped
POST /sync/agent/start Start the sync agent
POST /sync/agent/stop Stop the sync agent
POST /sync/agent/report-error Send an error report to qHarbor
GET /sync/agent/error-report Get an error report for manual sending

Sync Sources

Manage sync sources — configurations that define where data comes from.

Method Endpoint Description
GET /sync/sources List all sync sources
POST /sync/sources Create a new sync source
GET /sync/sources/{id} Get a sync source by ID
GET /sync/sources/name/{name} Get a sync source by name
PATCH /sync/sources/{id} Update a sync source
DELETE /sync/sources/{id} Delete a sync source
POST /sync/sources/{id}/start Start a sync source
POST /sync/sources/{id}/stop Stop a sync source
POST /sync/sources/{id}/take-ownership Claim ownership of a sync source for the current user (overwrites any existing owner)
POST /sync/sources/{id}/release-ownership Release ownership of a sync source. Idempotent — any logged-in user may call (no-op when already unowned)
POST /sync/sources/{id}/reset-sync-items Reset sync items (retry failed or all)
GET /sync/sources/{id}/errors Get sync source errors (paginated, optional viewed filter)
PATCH /sync/sources/{id}/errors/{error_id} Update a sync-source error record (currently only the viewed flag)
POST /sync/sources/{id}/errors/mark-all-viewed Mark all errors of a sync source as viewed. Returns the number flipped
GET /sync/sources/backends List available backends
POST /sync/sources/{id}/report-error Send an error report to qHarbor
GET /sync/sources/{id}/error-report Get an error report for manual sending
POST /sync/sources/{id}/scope-mappings Create a new scope mapping
PATCH /sync/sources/{id}/scope-mappings/{identifier} Update a scope mapping
DELETE /sync/sources/{id}/scope-mappings/{identifier} Delete a scope mapping
GET /sync/sources/{id}/scope-mappings/unmapped Get unmapped scope identifiers
POST /sync/sources/{id}/scope-mappings/autoassign Auto-assign scope mappings

Sync Items

Manage sync items — individual datasets to be synchronized.

Method Endpoint Description
GET /sync/items?source_id=... List sync items (with filtering and pagination)
GET /sync/items/{id} Get a sync item by ID
PATCH /sync/items/{id}/reset Reset a sync item for retry
PATCH /sync/items/{id}/prioritize Prioritize a sync item
POST /sync/items/{id}/report-error Send an error report to qHarbor
GET /sync/items/{id}/error-report Get an error report for manual sending

Sync Backends

Manage sync backend packages.

Method Endpoint Description
GET /sync/backends List installed backends
POST /sync/backends/install/pypi Install a backend from PyPI
POST /sync/backends/install/local Install a backend from local path
POST /sync/backends/update/pypi Update a backend from PyPI
POST /sync/backends/update/local Update a backend from local path
DELETE /sync/backends/{name} Uninstall a backend

Sync Converters

Manage converter packages for file format conversion.

Method Endpoint Description
GET /sync/converters List installed converters
POST /sync/converters/install/pypi Install a converter from PyPI
POST /sync/converters/install/local Install a converter from local path
POST /sync/converters/update/pypi Update a converter from PyPI
POST /sync/converters/update/local Update a converter from local path
DELETE /sync/converters/{name} Uninstall a converter

Admin

Inspect service state for support and debugging.

Method Endpoint Description
GET /admin/logs/{service}?n=... Return the most recent N lines of a service's log file. service is api or sync_agent. Pass n=-1 to return the full file (default n=500)

Error Handling

All API errors return a consistent JSON error model:

{
  "error": "sync_source_not_found",
  "detail": "Sync source with id 123 not found"
}
  • error: A machine-readable error code (snake_case)
  • detail: A human-readable error message (optional)

Error Codes Reference

General Errors

Error Code Status Description
server_error 500 An internal server error occurred
server_unreachable 502 The remote server cannot be reached

Auth Errors

Error Code Status Description
no_user_logged_in 401 No user is currently logged in
user_already_has_token 409 User already has a local token (delete first)
token_not_found 404 Token uid not found in local database

Sync Agent Errors

Error Code Status Description
sync_agent_not_installed 503 Sync agent service is not installed
sync_agent_already_running 409 Sync agent is already running
sync_agent_already_stopped 409 Sync agent is already stopped
sync_status_error_not_found 404 Sync-status error record not found by id

Sync Source Errors

Error Code Status Description
sync_source_not_found 404 Sync source not found
sync_source_scope_not_found 404 Default scope not found
sync_source_backend_not_found 404 Backend not found
sync_source_name_already_taken 409 Source name already exists
sync_source_already_running 409 Sync source is already running
sync_source_already_stopped 409 Sync source is already stopped
sync_source_config_error 422 Invalid configuration
sync_source_backend_has_no_owner 422 Take-ownership called on a source whose backend does not support ownership (has_owner=False)
sync_source_error_not_found 404 Sync-source error record not found by id
scope_mapping_not_found 404 Scope mapping not found for identifier
scope_mapping_already_exists 409 Scope mapping already exists for identifier
scope_mapping_invalid_scope 404 Target scope UUID does not exist

Sync Item Errors

Error Code Status Description
sync_item_not_found 404 Sync item not found
sync_item_scope_mapping_not_found 404 Sync item has a scopeIdentifier but no mapping exists

Backend Errors

Error Code Status Description
backend_not_found 404 Backend not found
backend_install_failed 422 Backend installation failed
backend_update_failed 422 Backend update failed
backend_uninstall_failed 422 Backend uninstall failed
backend_invalid_package_path 422 Invalid local package path

Converter Errors

Error Code Status Description
converter_not_found 404 Converter not found
converter_install_failed 422 Converter installation failed
converter_update_failed 422 Converter update failed
converter_uninstall_failed 422 Converter uninstall failed
converter_invalid_package_path 422 Invalid local package path

Admin Errors

Error Code Status Description
log_file_not_found 404 Requested service's log file does not exist on disk

Python API

The Python API provides direct access to functionality. It's primarily intended for internal use by the REST API layer and the sync agent itself.

Local API Tokens

from etiket_api.python_api.auth.local.api_tokens import (
    create_api_token,
    list_api_tokens,
    delete_api_token,
    check_api_token,
)

# Create a token for the current user
token = await create_api_token(name="my-sync-token")
print(token.api_token)  # only shown on create

# List all local tokens
tokens = await list_api_tokens()
for t in tokens:
    print(f"{t.user_name}: {t.api_key_name} ({t.server_url})")

# Check if a token is still valid
result = await check_api_token(api_key_uid="...")
print(result.valid)

# Delete a token (revokes on server first)
await delete_api_token(api_key_uid="...")

Sync Agent

from etiket_api.python_api.sync.sync_agent import (
    get_sync_status,
    get_sync_errors,
    start_sync_agent,
    stop_sync_agent,
    set_sync_status_error_viewed,
    mark_all_sync_status_errors_viewed,
)

# Get current status
status = await get_sync_status()

# Fetch only unviewed errors (UI "unread" pane)
unread = await get_sync_errors(limit=10, skip=0, viewed=False)

# Mark one as viewed; or mark all of them
await set_sync_status_error_viewed(error_id=unread[0].id, viewed=True)
flipped = await mark_all_sync_status_errors_viewed()

# Start/stop the agent
await start_sync_agent()
await stop_sync_agent()

Sync Sources

from etiket_api.python_api.sync.sync_sources import (
    list_sync_sources,
    get_sync_source,
    get_sync_source_by_name,
    update_sync_source,
    delete_sync_source,
    start_sync_source,
    stop_sync_source,
    list_sync_source_definitions,
    reset_sync_source_sync_items,
    take_ownership,
    release_ownership,
    # Scope mapping functions
    create_scope_mapping,
    update_scope_mapping,
    delete_scope_mapping,
    get_unmapped_scope_identifiers,
    autoassign_scope_mappings,
    # Exceptions
    SyncSourceAlreadyRunningError,
    SyncSourceAlreadyStoppedError,
)

# List all sources
sources = list_sync_sources()

# Get a specific source
source = get_sync_source(source_id=1)
source = get_sync_source_by_name("my_source")

# Start/stop a sync source
try:
    source = start_sync_source(source_id=1)
except SyncSourceAlreadyRunningError:
    print("Source is already running")

try:
    source = stop_sync_source(source_id=1)
except SyncSourceAlreadyStoppedError:
    print("Source is already stopped")

# Reset failed sync items for a source (to retry them)
reset_count = reset_sync_source_sync_items(source_id=1)
print(f"Reset {reset_count} failed items")

# Reset ALL sync items (including successful ones)
reset_count = reset_sync_source_sync_items(source_id=1, include_successful=True)
print(f"Reset {reset_count} items (all)")

# List available backends
backends = list_sync_source_definitions()

# Claim ownership of a sync source for the current user (overwrites any existing owner)
source = await take_ownership(source_id=1)
print(source.owner)

# Release your own ownership (errors if you are not the current owner)
source = await release_ownership(source_id=1)
assert source.owner is None

# Error-log "viewed" management
from etiket_api.python_api.sync.sync_sources import (
    read_sync_source_errors,
    set_sync_source_error_viewed,
    mark_all_sync_source_errors_viewed,
)

# Fetch only unviewed errors (UI "unread" pane)
unread = await read_sync_source_errors(source_id=1, viewed=False)

# Mark one error as viewed, or un-view it
await set_sync_source_error_viewed(error_id=unread[0].id, viewed=True)

# Mark everything as viewed in one shot; returns the count flipped
flipped = await mark_all_sync_source_errors_viewed(source_id=1)

Scope Mappings

Scope mappings are used when a backend provides per-item scope routing. Each sync item may have a scopeIdentifier string that needs to be mapped to an actual scope UUID.

import uuid
from etiket_api.python_api.sync.sync_sources import (
    create_scope_mapping,
    update_scope_mapping,
    delete_scope_mapping,
    get_unmapped_scope_identifiers,
    autoassign_scope_mappings,
)

# Find identifiers that don't have a mapping yet
unmapped = get_unmapped_scope_identifiers(sync_source_id=1)
print(f"Unmapped identifiers: {unmapped}")

# Create a mapping from identifier to scope UUID
mapping = create_scope_mapping(
    sync_source_id=1,
    scope_identifier="my_scope_identifier",
    scope_uuid=uuid.UUID("12345678-1234-1234-1234-123456789abc"),
)

# Update an existing mapping to point to a different scope
mapping = update_scope_mapping(
    sync_source_id=1,
    scope_identifier="my_scope_identifier",
    scope_uuid=uuid.UUID("87654321-4321-4321-4321-cba987654321"),
)

# Delete a mapping
delete_scope_mapping(sync_source_id=1, scope_identifier="my_scope_identifier")

# Auto-assign mappings based on scope name matching
# (creates mappings where identifier matches exactly one scope name)
created_count = autoassign_scope_mappings(sync_source_id=1)
print(f"Auto-assigned {created_count} mappings")

Sync Items

from etiket_api.python_api.sync.sync_items import (
    list_sync_items,
    get_sync_item,
    reset_sync_item,
    prioritize_sync_item,
)

# List items for a source
items = list_sync_items(source_id=1)

# Get a specific item
item = get_sync_item(sync_item_id=123)

# Reset or prioritize an item
reset_sync_item(sync_item_id=123)
prioritize_sync_item(sync_item_id=123)

Backends

from etiket_api.python_api.sync.backends import (
    list_backends,
    install_backend_from_pypi,
    install_backend_from_local_path,
    update_backend_from_pypi,
    uninstall_backend,
)

# List installed backends
backends = list_backends()

# Install from PyPI
install_backend_from_pypi("etiket-sync-agent-qcodes")

# Install from local path
install_backend_from_local_path("/path/to/my-backend")

# Update from PyPI
update_backend_from_pypi("etiket-sync-agent-qcodes")

# Uninstall
uninstall_backend("etiket_sync_agent_qcodes")

Converters

from etiket_api.python_api.sync.converters import (
    list_converters,
    install_converter_from_pypi,
    install_converter_from_local_path,
    update_converter_from_pypi,
    uninstall_converter,
)

# List installed converters
converters = list_converters()

# Install from PyPI
install_converter_from_pypi("my-converter-package")

# Install from local path
install_converter_from_local_path("/path/to/my-converter")

# Update from PyPI
update_converter_from_pypi("my-converter-package")

# Uninstall
uninstall_converter("my_converter")

Admin / Logs

from etiket_api.python_api.admin.logs import (
    LogService,
    get_recent_log_lines,
)

# Read the last 500 lines of the API's log file
lines = get_recent_log_lines(LogService.api, n=500)
for line in lines:
    print(line)

# Read the entire log file (up to the 10 MB rotation cap)
all_lines = get_recent_log_lines(LogService.sync_agent, n=-1)

Architecture

┌─────────────────────────────────────────────────────────────┐
│                      eTiKeT SDK                             │
│                   (User-facing Python SDK)                  │
└─────────────────────────┬───────────────────────────────────┘
                          │ HTTP
                          ▼
┌─────────────────────────────────────────────────────────────┐
│                      eTiKeT API                             │
│  ┌──────────────────┐   ┌──────────────────────────────┐    │
│  │    REST API      │   │        Python API            │    │
│  │    (FastAPI)     │──▶│   auth/local, sync/agent,    │    │
│  │                  │   │   sync/sources, sync/items.. │    │
│  └──────────────────┘   └──────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│                   eTiKeT Sync Agent                         │
│            (Background synchronization service)             │
└─────────────────────────────────────────────────────────────┘

Requirements

  • Python 3.10+
  • etiket_sync_agent
  • etiket_client

Project details


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_api-0.3.0b1-cp314-cp314-win_amd64.whl (499.8 kB view details)

Uploaded CPython 3.14Windows x86-64

etiket_api-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.3 MB view details)

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

etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl (575.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl (515.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

etiket_api-0.3.0b1-cp313-cp313-win_amd64.whl (491.3 kB view details)

Uploaded CPython 3.13Windows x86-64

etiket_api-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.3 MB view details)

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

etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl (576.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl (512.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

etiket_api-0.3.0b1-cp312-cp312-win_amd64.whl (498.0 kB view details)

Uploaded CPython 3.12Windows x86-64

etiket_api-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.4 MB view details)

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

etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl (578.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl (516.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

etiket_api-0.3.0b1-cp311-cp311-win_amd64.whl (510.9 kB view details)

Uploaded CPython 3.11Windows x86-64

etiket_api-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.3 MB view details)

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

etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl (583.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl (522.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

etiket_api-0.3.0b1-cp310-cp310-win_amd64.whl (507.8 kB view details)

Uploaded CPython 3.10Windows x86-64

etiket_api-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.2 MB view details)

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

etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl (591.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl (528.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file etiket_api-0.3.0b1-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f25d70636d02d4ab8cd33438199221b5964ab841553732e8a8bfcb907e2d95f2
MD5 4b98ded50953cad44c7e691f099c1f53
BLAKE2b-256 5d43ba1ea2e1cf26e26034133892b988085769c98644ee4a1017b5901c2e5d0d

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c363335b6b6861c95a89527e19946e416f3089c65caa860732497b506b227f77
MD5 86f9d6db0af909723fd2c1a173972993
BLAKE2b-256 a64e33aec8de9844fc4a8222d573c04dd5fe392854a4b6ed4843f8c3bfc6ce02

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 775a58a2029e2a9702fcf6b7d2ed8c208b4eb9baba0a1eef0075565bff79035e
MD5 f52f121b7c0ebf6994610a669803e278
BLAKE2b-256 8f32b7914d507a271ae916dd2a3af3f5d6c72ac4a32058296c0ffb1af0220941

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0940e3393ccebe394e060374b830b69df732ecec8533794fbc7b437142d57fc8
MD5 bfbc8a9da563e58df83d43e35d44bcd5
BLAKE2b-256 57415d45e81089b1b4a058bdbd407c577ce21ee9999d84d704f90bd953d19074

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a863a50440ca24c5072507def07c37d7c1679df3883ba012118a855de1b61915
MD5 e1ead0a13f730c9ead66e6600c030f14
BLAKE2b-256 f0d519811cf5e0359d1b57cfbc4bbe321a822016cacd93163c26ae38c626369a

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 641393bac9ed3e2aa3b8d3235a2a4ed2faa2bc53772c4ee56f811b2b9a103da0
MD5 bf3b1d76ca09bc79dbfc3fdeba9f0942
BLAKE2b-256 8bcafcb03eb8b9e9feb7ac81135f86cf95249070429c12973c62eb05f9468dac

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 7d81d3302f9eba60058a8dfe22e33c5fb8b62be142294d0e43a7f5cc926ff570
MD5 4f1095df7b7add057aaca673f03c234e
BLAKE2b-256 e5c638803a92a72244e643329184998479eeb94aafc3351a1a85c98e414e00d1

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8a9419d9e06c9bc856878e90af75ffcbc8fef93c690aa8ed1e269e80bac8807a
MD5 d05ee7d3ececaae994367e5f0dca1a3f
BLAKE2b-256 87fa5172f763b1ab65765a01adbb5507c63694169bd41315c06622400b91f5ed

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2dd7f2580d3736e3382ed79aa940ca8b86869f088f949b6ea3d79526bf8250c5
MD5 f7bc11f6c40a34ad3749fb4aed10ce89
BLAKE2b-256 7485386d82b38dc35a0346031e1fa5560c35acf8184253467afdc4b0917ce937

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 070417eebff71d0e7545e06727ab0058387688c7ef516a1d51ccc4a80a18c689
MD5 9fdbe9090c80b02cc0521f91cf9f1b3e
BLAKE2b-256 6d82d7eed6246a7b7d835dbe13d95db40cbaa9665bcd09e0e7707985676d3dd0

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d79a2c1745e073eb9ba36fa681dc5da9b712a36042b73d4aa6aa1bf36efb3a1c
MD5 447313b571de6112752b021bd0c8851c
BLAKE2b-256 aa2f7554353fe75628abea59b8ea8cb44214b577b84a100cef26e25765078ec6

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2b6894a5a5c43a1ea665ff42f00376f8cf853618d4b4c233c1cf2403acbfd3a
MD5 27a92fdbdbe0e0b632c30003462dbb88
BLAKE2b-256 01717b25171ca43395b8fd0eb8374683ff7cd501b7f1672454c4e19cd4695eaf

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8df3403c24804a98e486e9b0062a01ebcf783ea6c9167b03a0efe370991aafa4
MD5 05ef356d147bc7a32905099bf5050428
BLAKE2b-256 c893c76898145d20373edba1a770520b2d8c2ad6411bf67a01697eaf3303e5f6

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 42c7182ca19591dc587bc74a63f13ace346132095996f6bcc5a1971ca87fa877
MD5 db4eddf1e50cd3142a7584475f14eaaa
BLAKE2b-256 428361e341bab9a7af005059d4c8edbfebde9a79b02180b800271e787c5161a0

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 77a5dcffa41acf3643af52a505fc3a0edc61494c25ad3820cef71bc20e3b95fa
MD5 ccd814d40f0c55d4c83acf5e0d86382d
BLAKE2b-256 cdd7f4a03ef4528dd74fe5e9a02e5457d394e1738b5f0346c1dbe1d8e884daf7

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0be4dfc1f9a69b72f3baba89843032ce02a53e62b0935bf83d432c80b20869cc
MD5 f401b98e49d7805b3b2ef1e150718e8f
BLAKE2b-256 4171fd34daa08cd0c3c6c65a12113a7177a230ddb3d4db6a4bf18fb605ce5771

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7f184a1113a407e8d6e4a95d703b94f4faa16d9e8a55a4766c1e501a4b1e3c44
MD5 52821039b79bac8fbc33e1480e04efc5
BLAKE2b-256 b9c702b2fd9e0fb968e83fa34e74f7efbb6365ab41854205e6424bff081602de

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4d6fc3ef14d2912090a49a442fb60c8a08a91e1e81dcbade27179c4c8264ed48
MD5 066cf7ae3dcf2840b5634406a1814c71
BLAKE2b-256 4c9258feb4d96c1b32e9a7515cf8bbd63c75c97dcd2717d9e3fc9adf2f407d31

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 bc73c78039e928e92ae2c605f53f3464dd3f56dffbe21a9191fb1b85c1a43ba5
MD5 33f87fa03e3e01f27f04d57e0236e06c
BLAKE2b-256 095eff934b25de46bf0a93035f6b6a8459252fc6c2668102cf475f23aa9b6546

See more details on using hashes here.

File details

Details for the file etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bc6e4d1f71683da4820c0322f41738cb9f90251c23056c17a22f57d93bd59742
MD5 db71ed72b6cd64f1d4c316e36f164be0
BLAKE2b-256 c75f54a13a2e9aa9fb643baf02298d85e3be7ad36322f9c43e7d5457f084e91d

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