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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file etiket_api-0.3.0b1-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 499.8 kB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f25d70636d02d4ab8cd33438199221b5964ab841553732e8a8bfcb907e2d95f2
|
|
| MD5 |
4b98ded50953cad44c7e691f099c1f53
|
|
| BLAKE2b-256 |
5d43ba1ea2e1cf26e26034133892b988085769c98644ee4a1017b5901c2e5d0d
|
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
- Download URL: etiket_api-0.3.0b1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.3 MB
- Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c363335b6b6861c95a89527e19946e416f3089c65caa860732497b506b227f77
|
|
| MD5 |
86f9d6db0af909723fd2c1a173972993
|
|
| BLAKE2b-256 |
a64e33aec8de9844fc4a8222d573c04dd5fe392854a4b6ed4843f8c3bfc6ce02
|
File details
Details for the file etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_x86_64.whl
- Upload date:
- Size: 575.7 kB
- Tags: CPython 3.14, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
775a58a2029e2a9702fcf6b7d2ed8c208b4eb9baba0a1eef0075565bff79035e
|
|
| MD5 |
f52f121b7c0ebf6994610a669803e278
|
|
| BLAKE2b-256 |
8f32b7914d507a271ae916dd2a3af3f5d6c72ac4a32058296c0ffb1af0220941
|
File details
Details for the file etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 515.8 kB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0940e3393ccebe394e060374b830b69df732ecec8533794fbc7b437142d57fc8
|
|
| MD5 |
bfbc8a9da563e58df83d43e35d44bcd5
|
|
| BLAKE2b-256 |
57415d45e81089b1b4a058bdbd407c577ce21ee9999d84d704f90bd953d19074
|
File details
Details for the file etiket_api-0.3.0b1-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 491.3 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a863a50440ca24c5072507def07c37d7c1679df3883ba012118a855de1b61915
|
|
| MD5 |
e1ead0a13f730c9ead66e6600c030f14
|
|
| BLAKE2b-256 |
f0d519811cf5e0359d1b57cfbc4bbe321a822016cacd93163c26ae38c626369a
|
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
- Download URL: etiket_api-0.3.0b1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.3 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
641393bac9ed3e2aa3b8d3235a2a4ed2faa2bc53772c4ee56f811b2b9a103da0
|
|
| MD5 |
bf3b1d76ca09bc79dbfc3fdeba9f0942
|
|
| BLAKE2b-256 |
8bcafcb03eb8b9e9feb7ac81135f86cf95249070429c12973c62eb05f9468dac
|
File details
Details for the file etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_x86_64.whl
- Upload date:
- Size: 576.4 kB
- Tags: CPython 3.13, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d81d3302f9eba60058a8dfe22e33c5fb8b62be142294d0e43a7f5cc926ff570
|
|
| MD5 |
4f1095df7b7add057aaca673f03c234e
|
|
| BLAKE2b-256 |
e5c638803a92a72244e643329184998479eeb94aafc3351a1a85c98e414e00d1
|
File details
Details for the file etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 512.4 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a9419d9e06c9bc856878e90af75ffcbc8fef93c690aa8ed1e269e80bac8807a
|
|
| MD5 |
d05ee7d3ececaae994367e5f0dca1a3f
|
|
| BLAKE2b-256 |
87fa5172f763b1ab65765a01adbb5507c63694169bd41315c06622400b91f5ed
|
File details
Details for the file etiket_api-0.3.0b1-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 498.0 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2dd7f2580d3736e3382ed79aa940ca8b86869f088f949b6ea3d79526bf8250c5
|
|
| MD5 |
f7bc11f6c40a34ad3749fb4aed10ce89
|
|
| BLAKE2b-256 |
7485386d82b38dc35a0346031e1fa5560c35acf8184253467afdc4b0917ce937
|
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
- Download URL: etiket_api-0.3.0b1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.4 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
070417eebff71d0e7545e06727ab0058387688c7ef516a1d51ccc4a80a18c689
|
|
| MD5 |
9fdbe9090c80b02cc0521f91cf9f1b3e
|
|
| BLAKE2b-256 |
6d82d7eed6246a7b7d835dbe13d95db40cbaa9665bcd09e0e7707985676d3dd0
|
File details
Details for the file etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_x86_64.whl
- Upload date:
- Size: 578.3 kB
- Tags: CPython 3.12, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d79a2c1745e073eb9ba36fa681dc5da9b712a36042b73d4aa6aa1bf36efb3a1c
|
|
| MD5 |
447313b571de6112752b021bd0c8851c
|
|
| BLAKE2b-256 |
aa2f7554353fe75628abea59b8ea8cb44214b577b84a100cef26e25765078ec6
|
File details
Details for the file etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 516.6 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2b6894a5a5c43a1ea665ff42f00376f8cf853618d4b4c233c1cf2403acbfd3a
|
|
| MD5 |
27a92fdbdbe0e0b632c30003462dbb88
|
|
| BLAKE2b-256 |
01717b25171ca43395b8fd0eb8374683ff7cd501b7f1672454c4e19cd4695eaf
|
File details
Details for the file etiket_api-0.3.0b1-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 510.9 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8df3403c24804a98e486e9b0062a01ebcf783ea6c9167b03a0efe370991aafa4
|
|
| MD5 |
05ef356d147bc7a32905099bf5050428
|
|
| BLAKE2b-256 |
c893c76898145d20373edba1a770520b2d8c2ad6411bf67a01697eaf3303e5f6
|
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
- Download URL: etiket_api-0.3.0b1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.3 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
42c7182ca19591dc587bc74a63f13ace346132095996f6bcc5a1971ca87fa877
|
|
| MD5 |
db4eddf1e50cd3142a7584475f14eaaa
|
|
| BLAKE2b-256 |
428361e341bab9a7af005059d4c8edbfebde9a79b02180b800271e787c5161a0
|
File details
Details for the file etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_x86_64.whl
- Upload date:
- Size: 583.7 kB
- Tags: CPython 3.11, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77a5dcffa41acf3643af52a505fc3a0edc61494c25ad3820cef71bc20e3b95fa
|
|
| MD5 |
ccd814d40f0c55d4c83acf5e0d86382d
|
|
| BLAKE2b-256 |
cdd7f4a03ef4528dd74fe5e9a02e5457d394e1738b5f0346c1dbe1d8e884daf7
|
File details
Details for the file etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 522.2 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0be4dfc1f9a69b72f3baba89843032ce02a53e62b0935bf83d432c80b20869cc
|
|
| MD5 |
f401b98e49d7805b3b2ef1e150718e8f
|
|
| BLAKE2b-256 |
4171fd34daa08cd0c3c6c65a12113a7177a230ddb3d4db6a4bf18fb605ce5771
|
File details
Details for the file etiket_api-0.3.0b1-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 507.8 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f184a1113a407e8d6e4a95d703b94f4faa16d9e8a55a4766c1e501a4b1e3c44
|
|
| MD5 |
52821039b79bac8fbc33e1480e04efc5
|
|
| BLAKE2b-256 |
b9c702b2fd9e0fb968e83fa34e74f7efbb6365ab41854205e6424bff081602de
|
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
- Download URL: etiket_api-0.3.0b1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d6fc3ef14d2912090a49a442fb60c8a08a91e1e81dcbade27179c4c8264ed48
|
|
| MD5 |
066cf7ae3dcf2840b5634406a1814c71
|
|
| BLAKE2b-256 |
4c9258feb4d96c1b32e9a7515cf8bbd63c75c97dcd2717d9e3fc9adf2f407d31
|
File details
Details for the file etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_x86_64.whl
- Upload date:
- Size: 591.9 kB
- Tags: CPython 3.10, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc73c78039e928e92ae2c605f53f3464dd3f56dffbe21a9191fb1b85c1a43ba5
|
|
| MD5 |
33f87fa03e3e01f27f04d57e0236e06c
|
|
| BLAKE2b-256 |
095eff934b25de46bf0a93035f6b6a8459252fc6c2668102cf475f23aa9b6546
|
File details
Details for the file etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: etiket_api-0.3.0b1-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 528.8 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc6e4d1f71683da4820c0322f41738cb9f90251c23056c17a22f57d93bd59742
|
|
| MD5 |
db71ed72b6cd64f1d4c316e36f164be0
|
|
| BLAKE2b-256 |
c75f54a13a2e9aa9fb643baf02298d85e3be7ad36322f9c43e7d5457f084e91d
|