KeyShare DOCS
  • Overview
  • Getting Started
  • Hotel
  • Wallet SDK
  • Platform support
  • SDK modules
  • Installation
  • Quick start
  • Data flow
  • Error codes
  • Integration timeline
  • GEP Command API
  • Endpoints
  • Design principles
  • Authentication
  • PMS adapters
  • Error model
  • Government
  • Platform APIs
  • API surface
  • Credential formats
  • Integration architecture
  • Mobile SDKs
  • SDK modules
  • Physical Access
  • Connect & Reader Library
  • Hardware
  • Puck Specification
  • Reference
  • Standards & Security
  • Rate Limits
  • CORS Policy
  • Authentication
  • Troubleshooting
Back to keyshare.id
⌘K
Contact See It In Action

Developer Hub

SDKs, APIs, and integration resources for identity verification and credential delivery across hotels, governments, and buildings.

Last updated: March 2026

Build your first hotel check-in

A conceptual walkthrough — install the SDK, start a session, handle the NFC tap, and process the result.

1
Install the SDK

Add KeyShareCore + KeyShareWallet via CocoaPods, SPM, or Gradle. See the Hotel → Wallet SDK tab for full installation guides.

2
Initialize KeyShareCore
Swift
let keyshare = KeyShareCore(
    apiKey: "ks_live_...",
    propertyId: "prop_abc123"
)
3
Start a check-in session

Every write operation requires an idempotency key — a UUID v4, valid for 24 hours. Include it as X-Idempotency-Key in the request header. This is required for payment and key issuance operations.

Swift
let session = try await keyshare.checkIn.start(
    reservationId: "RES-2026-001",
    idempotencyKey: UUID().uuidString  // Required — UUID v4, 24-hr validity
)  // SLA: < 200ms p95
4
Handle the NFC tap

Present the tap UI. The SDK manages the NFC protocol, Puck communication, and credential exchange.

Swift
let result = try await session.awaitTap()
switch result {
case .success(let credential):
    // Wallet key provisioned, identity verified
    print("Room \(credential.roomNumber) — key active")
case .failure(let error):
    // See Error Codes in the Reference tab
    handle(error)
}
5
Handle errors

All errors return a consistent JSON format:

JSON
{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Too many requests",
    "details": { "retryAfter": 60 },
    "requestId": "req_abc123"
  }
}

This is a conceptual walkthrough. Full API reference, sandbox access, and integration engineers are available to licensed customers. Request access →

What's new

VersionChange
Wallet SDK 2.0.1Added EUDI credential format support to Identity moduleLatest
Wallet SDK 2.0.0Initial SDK release (iOS and Android)
GEP Command API v1REST API for property management integration
Connect v1Cloud-to-panel integration for Mercury LP/MP series

What's available

VerticalDeveloper ResourcesAccess
HotelWallet SDK (iOS, Android), GEP Command APISDK access included with GEP license. Request access →
GovernmentPlatform REST APIs, Mobile SDKs, Reference Wallet sourceAvailable to deployment partners. Request a briefing →
Physical AccessConnect API, Reader Library firmware SDK, VEP APIAvailable to system integrators. Request access →
HardwarePuck specification and NFC protocol docsAvailable under NDA. Request access →
Hotel

Wallet SDK

v2.0.1

Use the Wallet SDK to add NFC tap-to-collect to your hotel guest app. The SDK handles Puck communication, credential exchange, and wallet provisioning — you control the UI and guest experience.

Last updated: March 2026

Platform support

PlatformMinimumLanguageDistributionBinary Size
iOSiOS 15.0+Swift 5.7+CocoaPods, SPM~2 MB
AndroidAPI 26+Kotlin 1.9+Maven Central~2.5 MB

SDK modules

ModuleiOSAndroidFunction
CoreKeyShareCorekeyshare-coreAPI client, Puck communication, NFC sessionRequired
WalletKeyShareWalletkeyshare-walletKey provisioning to native walletRequired
IdentityKeyShareIdentitykeyshare-identitymDL/EUDI presentation, selective disclosureOptional
UIKeyShareUIkeyshare-uiPre-built check-in screens, tap animationOptional
Module independence is real. A key-only integration imports Core + Wallet. Adding identity later means importing Identity — no refactoring.

Installation

iOS — CocoaPods

Podfile
# Podfile — minimum integration (key delivery)
pod 'KeyShareCore', '~> 2.0'
pod 'KeyShareWallet', '~> 2.0'

# Optional modules
pod 'KeyShareIdentity', '~> 2.0'  # mDL/EUDI verification
pod 'KeyShareUI', '~> 2.0'        # Pre-built check-in screens

iOS — Swift Package Manager

Package.swift
// Package.swift
dependencies: [
    .package(url: "https://github.com/keyshare/ios-sdk.git", from: "2.0.0")
]

Android — Gradle

build.gradle.kts
// build.gradle.kts
dependencies {
    implementation("io.keyshare:core:2.0.0")
    implementation("io.keyshare:wallet:2.0.0")

    // Optional modules
    implementation("io.keyshare:identity:2.0.0")
    implementation("io.keyshare:ui:2.0.0")
}

Quick start

iOS (Swift)

Swift
import KeyShareCore
import KeyShareWallet

let keyshare = KeyShareCore(
    apiKey: "ks_live_...",
    environment: .production
)

// Start a check-in session
let session = try await keyshare.checkIn.start(
    reservationId: "RES-2026-001",
    idempotencyKey: UUID().uuidString
)

// Await guest tap on Puck
let credential = try await session.awaitTap()
print("Room \(credential.roomNumber) — key active")

Android (Kotlin)

Kotlin
import io.keyshare.core.KeyShareCore
import io.keyshare.wallet.KeyShareWallet

val keyshare = KeyShareCore.Builder()
    .apiKey("ks_live_...")
    .environment(Environment.PRODUCTION)
    .build()

// Start a check-in session
val session = keyshare.checkIn.start(
    reservationId = "RES-2026-001",
    idempotencyKey = UUID.randomUUID().toString()
)

// Await guest tap on Puck
val credential = session.awaitTap()
println("Room ${credential.roomNumber} — key active")

Data flow

StepFromToPayload
1Guest AppPuck (NFC)Session token + credential request
2PuckGEP LocalSigned credential exchange
3GEP LocalPMSReservation verification
4GEP LocalPuckWallet key + room assignment
5Puck (NFC)Guest AppProvisioned credential

Error codes

CodeHTTPMeaningResolution
NFC_SESSION_TIMEOUT—Guest didn't tap within the timeout windowPrompt guest to re-tap
PUCK_NOT_FOUND—No Puck detected in NFC rangeCheck Puck power/positioning
RESERVATION_NOT_FOUND404Reservation ID invalid or expiredVerify reservation ID in PMS
KEY_ALREADY_ISSUED409Key already provisioned for this reservationRevoke existing key first
RATE_LIMIT_EXCEEDED429Too many requestsImplement exponential backoff

Integration timeline

ScopeModulesTimeline
Key delivery onlyCore + Wallet1–2 weeks
Key + identityCore + Wallet + Identity3–4 weeks
Full integrationAll modules + PMS adapter4–8 weeks
Request SDK Access Hotel Solutions →

Hotel

GEP Command API

v1

Use the Command API to integrate your property management system with KeyShare. Send commands to the Guest Experience Platform — check-in, key issuance, identity verification — and get results via polling or callback.

Last updated: March 2026

Endpoints

MethodPathPurpose
POST/commandSubmit a new command (check-in, key issue, ID verify)
GET/command/{id}Poll command status and result
POST/command/{id}/cancelCancel a pending command
GET/healthGEP Local health and Puck connectivity

Design principles

Async-first — Every command returns immediately with a commandId. Results via polling or callback.
PMS-agnostic — Adapter layer abstracts PMS differences. Same API for Opera, Mews, Apaleo, and others.
Idempotent — Client-supplied idempotencyKey (UUID, 24-hr validity) prevents duplicate execution on retries.
Least privilege — Each API key is scoped to specific command types.

Authentication

API LayerAuth MethodScope
GEP LocalJWT (RS256)Organization-scoped RBAC
GEP CloudJWT (RS256)Organization-scoped RBAC
Command APIAPI Key (X-API-Key header)Per-integration configurable scopes

PMS adapters

PMSAuthWebhooksRate Limit
Opera (OHIP)OAuth2LimitedProperty-specific
MewsOAuth2 + Platform TokenYes (2.0)200 req/min
ApaleoOAuth2Yes (v2)Rate limited
BookingCenterAPI KeyPolling only60 req/min
ShijiOAuth2Yes120 req/min
CloudbedsOAuth2Yes100 req/min

Error model

All API errors use a consistent envelope. Include requestId when contacting support.

JSON
{
  "error": {
    "code": "COMMAND_REJECTED",
    "message": "Night audit in progress — write operations paused",
    "details": {
      "retryAfter": 300,
      "auditWindow": "02:00–02:15 UTC"
    },
    "requestId": "req_abc123"
  }
}
Request API Docs
Government

Digital ID Platform APIs

Use these REST APIs to integrate government systems with credential issuance, verification, and lifecycle management infrastructure. Available to deployment partners.

Last updated: March 2026

API surface

APIPurposeAuthentication
Credential APIIssue, revoke, suspend, query credential statusOrganization attestation token
Workflow APIDefine, deploy, version, trigger issuance workflowsOrganization attestation token
Presentation APIRequest credential presentations from holdersVerifier attestation token
Trust APIQuery trust chain, validate attestations, check governancePlatform-scoped token
Admin APIEcosystem management, org onboarding, schema managementAdmin token

Credential formats supported

FormatStandardUse Case
W3C VCVC Data Model 2.0General-purpose credentials
ISO 18013-5 (mDL)ISO/IEC 18013-5:2021Mobile driver's licenses, government-issued ID
EUDI ARFEU Digital Identity Architecture v1.4EU-wide interoperable credentials

Integration architecture

Government Authority
        │
        ▼
┌─────────────────────┐
│  Credential API     │ ← Issue / revoke / suspend
│  Workflow API       │ ← Define issuance flows
│  Trust API          │ ← Validate attestation chain
└─────────────────────┘
        │
        ▼
   Holder Wallet (SDK)
        │
        ▼
   Verifier (Presentation API)
Request a Briefing Government Solutions →

Government

Government Mobile SDKs

Use these SDKs to build holder wallets and verifier apps for sovereign digital identity ecosystems. The SDKs handle credential storage, selective disclosure, and NFC/QR presentation.

Last updated: March 2026

SDK modules

ModuleiOSAndroidFunction
CoreGovIDCoregovid-coreCredential storage, cryptographic operations
PresentationGovIDPresentgovid-presentSelective disclosure, NFC/QR presentation
IssuanceGovIDIssuegovid-issueCredential issuance flow, authority binding
BiometricGovIDBiogovid-bioFace matching, liveness detection (on-device)
Zero biometric retention — Face matching data processed in RAM. Discarded in <1 second. No PII stored on device.
Hardware-backed keys — All credentials bound to TEE/Secure Enclave. Keys never leave hardware.
Request SDK Access
Physical Access

Connect & Reader Library

Use Connect to link your access control panel to the KeyShare cloud. Use the Reader Library to build NFC readers that accept KeyShare credentials. Both follow OSDP v2.2.

Last updated: March 2026

Integration architecture

KeyShare Cloud
      │
      ▼ (Connect API — REST + WebSocket)
┌─────────────────┐
│  Access Panel   │ ← Mercury LP/MP series
│  (OSDP v2.2)   │
└─────────────────┘
      │
      ▼ (Wiegand / OSDP)
┌─────────────────┐
│  NFC Reader     │ ← Reader Library firmware
│  (ARM Cortex)   │
└─────────────────┘
      │
      ▼ (NFC)
   Guest Phone / Puck

Connect API

FeatureDetail
ProtocolREST + WebSocket (real-time events)
AuthenticationmTLS + API Key
Supported PanelsMercury LP/MP series, HID VertX
Credential TypesMobile key, mDL, employee badge
Offline Mode72-hour manifest cache

Reader Library

FeatureDetail
TargetARM Cortex-M4+ (128KB+ RAM)
LanguageC (MISRA C:2012 compliant)
NFC StackISO 14443-A/B, ISO 18013-5
CryptowolfSSL (FIPS 140-2)
CommunicationOSDP v2.2 (encrypted)

Communication protocols

LayerProtocolDirection
Cloud ↔ PanelREST + WebSocket (TLS 1.3)Bidirectional
Panel ↔ ReaderOSDP v2.2 (AES-128)Bidirectional
Reader ↔ PhoneNFC (ISO 14443)Reader-initiated

Performance targets

MetricTarget
NFC tap-to-unlock< 500ms
Cloud credential sync< 2s
Offline credential validation< 100ms
Reader boot time< 3s
Request Integration Docs Physical Access Solutions →
Hardware

Puck Specification

The Puck is the NFC hardware device at the center of every KeyShare deployment. It connects to GEP Local via USB and communicates with guest phones via NFC.

Last updated: March 2026

Public specifications

PropertyValue
InterfaceNFC + QR (dual)
Secure ElementCC EAL5+ (ATECC608B)
Crypto LibrarywolfSSL (FIPS 140-2)
Identity StandardsISO 18013-5, EUDI ARF
Mobile CompatibilityiOS 16+ / Android 11+
Battery Backup30+ min (1500mAh Li-Po)
Patents4 US patents granted

Deployment connectivity

Guest Phone (NFC)
      ↓
KeyShare Puck — no WiFi, no Bluetooth, no Ethernet. NFC + USB only.
      ↓ USB (power + data)
GEP Local (on-premises server)
      ↓ TLS 1.3
KeyShare Cloud (optional sync)

SLA targets

MetricTarget
NFC response time< 300ms
Uptime (with USB power)99.9%
Firmware OTA update< 60s
Mean time between failures> 50,000 hours
Request Full Specification Puck Product Page →
Reference

Standards & Security

KeyShare products are built on open standards and audited security practices.

Last updated: March 2026

Standards compliance

StandardScope
ISO 18013-5Identity verification (mDL) — Puck, SDKs, Platform APIs
W3C Verifiable CredentialsCredential format — Government Platform, Digital ID SDKs
OSDP v2.2Reader communication — Reader Library, Connect
FIDO2Authentication — Platform services
FIPS 140-2Cryptographic operations (wolfSSL) — Puck
MISRA C:2012Firmware coding standard — Reader Library

Security highlights

Token-based auth — HMAC signatures or attestation tokens. No API keys in query strings.
Hardware-backed crypto — TEE/Secure Enclave operations. Keys never leave hardware.
TLS 1.3 + AES-256 — All data in transit and at rest encrypted.
Zero biometric retention — Face matching data processed in RAM, discarded in <1 second.
Security & Trust Center →

Reference

Rate Limits

All API endpoints are rate-limited using a Redis-backed sliding window algorithm. Limits vary by endpoint category and authentication method.

Last updated: March 2026

General API rate limits

CategoryUser LimitAPI Key LimitBurst
Authentication10/minN/A3
Read Operations100/min1000/min20
Write Operations30/min300/min5
Bulk Operations5/min50/min1
Search/Query20/min200/min5
Export2/min10/min1

SDK endpoint limits

EndpointLimitWindow
/check-in/start30/minPer API key
/identity/verify50/minPer API key
/keys/provision100/minPer API key
/profiles/*100/minPer API key

Rate limit headers

Every API response includes rate limit headers:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds to wait before retrying (only on 429 responses)
Example 429 Response
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1711497600
Retry-After: 45

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded for write operations",
    "details": { "retryAfter": 45 }
  }
}

Reference

CORS Policy

Cross-Origin Resource Sharing configuration for browser-based API integrations.

Last updated: March 2026
SettingValue
Allowed OriginsConfigured per property (allowlist)
Allowed MethodsGET, POST, PUT, DELETE, OPTIONS
Allowed HeadersAuthorization, Content-Type, X-Request-ID, X-Idempotency-Key
Credentialstrue
Max Age86400 (24 hours)
Per-property allowlisting. Origins are configured per property during onboarding. Contact your integration engineer to add additional origins.

Reference

Authentication & API Key Lifecycle

Auth model, token types, and key rotation procedures.

Last updated: March 2026

Auth model

APIMethodToken Format
GEP Local / CloudJWT (RS256)Organization-scoped RBAC claims
Command APIAPI KeyX-API-Key header
Platform APIsAttestation tokenOrganization / Verifier / Admin scopes

API key rotation procedure

1
Create new key with the same permissions as the key being rotated.
2
Update your integration to use the new key.
3
Monitor old key usage during the 7-day grace period.
4
Revoke old key after confirming zero traffic.
cURL — API Key Header
curl -X POST https://{property}.keyshare.io/gep/command/v1/command \
  -H "X-API-Key: ks_live_abc123def456" \
  -H "X-Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
  -H "Content-Type: application/json" \
  -d '{"type": "CHECK_IN", "reservationId": "RES-2026-001"}'

Reference

Troubleshooting

Common integration issues, their root causes, and resolutions.

Last updated: March 2026
ScenarioBehaviorResolution
Authentication lockoutProgressive lockout: 3 failures → 1 min, 5 → 15 min, 10 → 1 hr, 15 → 24 hr, 20+ → permanentWait for lockout expiry. Contact support for permanent lockout reset.
429 Too Many RequestsRetry-After header returned with seconds to waitImplement exponential backoff. Check X-RateLimit-Remaining header proactively.
Session fixation detectedSession immediately invalidated; new authentication requiredRe-authenticate with fresh credentials. Do not reuse session tokens across contexts.
Night audit write rejectionWrite operations blocked during nightly PMS reconciliation (typically 02:00–02:15 UTC)Queue writes and retry after the audit window. Error includes auditWindow field.
Middleware timeoutPMS adapter timeout (>2 seconds) logged; system falls back to direct adapterCheck PMS connectivity. The adapter will auto-recover when the PMS responds.
Webhook delivery failureMessages enter dead letter queue. Alert triggered after 3 consecutive failures.Verify endpoint availability. Messages are retained in DLQ for manual replay.
Need help? — Contact your integration engineer or email dev-support@keyshare.io with your requestId.
Status page — Check real-time platform status at status.keyshare.io.

Get Access

Developer resources — SDK packages, API docs, sandbox environments, and Puck simulators — are available to licensed customers, deployment partners, and qualified evaluators.

Hotel brand SDK access, sandbox, integration engineer Request SDK Access
Government partner Platform APIs, Mobile SDKs, reference wallet, sandbox Request a Briefing
System integrator (PACS) Connect API docs, Reader Library SDK, certification guide Request Docs
Hardware evaluator Puck specification, NFC protocol docs, simulator access Request Access