Learn-skills.dev terra-auth
Terra API authentication, credentials management, and environment configuration. Use when setting up Terra integration, managing API keys, generating widget sessions, or configuring testing/staging/production environments.
git clone https://github.com/NeverSight/learn-skills.dev
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/adaptationio/skrillz/terra-auth" ~/.claude/skills/neversight-learn-skills-dev-terra-auth && rm -rf "$T"
data/skills-md/adaptationio/skrillz/terra-auth/SKILL.mdTerra Authentication & Credentials
Manage Terra API authentication across testing, staging, and production environments.
Credential Files
Credentials are stored in environment-specific
.env files:
| Environment | File |
|---|---|
| Testing | |
| Staging | |
| Production | |
Load credentials:
from dotenv import load_dotenv import os # Load specific environment load_dotenv(".env.terra.testing") dev_id = os.getenv("TERRA_DEV_ID") api_key = os.getenv("TERRA_API_KEY")
Or use the helper:
from scripts.terra_client import get_terra_client client = get_terra_client("testing") # or "staging", "production"
Quick Start
Python SDK Setup
from terra import Terra # Testing environment client = Terra( dev_id="botaniqalmedtech-testing-SjyfjtG33s", api_key="_W7Pm-kAaIf1GA_Se21NnzCaFZjg3Izc" ) # Verify connection integrations = client.integrations.fetch() print(f"Connected! {len(integrations.integrations)} providers available")
Environment Variables
# .env.testing TERRA_DEV_ID=botaniqalmedtech-testing-SjyfjtG33s TERRA_API_KEY=_W7Pm-kAaIf1GA_Se21NnzCaFZjg3Izc # .env.staging TERRA_DEV_ID=botaniqalmedtech-staging-uGKHOPRCi1 TERRA_API_KEY=fJia30spa-EqB_CMqZBzzrkMWZ_u2pv_ # .env.production TERRA_DEV_ID=botaniqalmedtech-prod-yrc99AwsT2 TERRA_API_KEY=Il4YUTc-e00EcvKGUx63j7YE3MJ-7QIz
Operations
setup-environment
setup-environmentConfigure Terra credentials for specific environment.
Python:
import os from terra import Terra def get_terra_client(env: str = "testing") -> Terra: """Get Terra client for specified environment.""" configs = { "testing": { "dev_id": "botaniqalmedtech-testing-SjyfjtG33s", "api_key": "_W7Pm-kAaIf1GA_Se21NnzCaFZjg3Izc" }, "staging": { "dev_id": "botaniqalmedtech-staging-uGKHOPRCi1", "api_key": "fJia30spa-EqB_CMqZBzzrkMWZ_u2pv_" }, "production": { "dev_id": "botaniqalmedtech-prod-yrc99AwsT2", "api_key": "Il4YUTc-e00EcvKGUx63j7YE3MJ-7QIz" } } config = configs.get(env) if not config: raise ValueError(f"Unknown environment: {env}") return Terra(dev_id=config["dev_id"], api_key=config["api_key"]) # Usage client = get_terra_client("testing")
generate-widget-session
generate-widget-sessionCreate authentication widget URL for end users.
Python:
def generate_widget_session( client: Terra, reference_id: str, success_url: str, failure_url: str, providers: list[str] = None ) -> str: """Generate widget session URL for user authentication.""" response = client.authentication.generatewidgetsession( reference_id=reference_id, auth_success_redirect_url=success_url, auth_failure_redirect_url=failure_url, providers=providers # Optional: filter providers ["FITBIT", "GARMIN"] ) return response.url # Usage widget_url = generate_widget_session( client=client, reference_id="user_12345", # Your internal user ID success_url="https://app.botaniqal.com/terra/success", failure_url="https://app.botaniqal.com/terra/failure" ) print(f"Redirect user to: {widget_url}")
Response:
{ "url": "https://widget.tryterra.co/session/abc123...", "session_id": "abc123...", "expires_at": "2025-12-05T12:15:00Z" }
generate-mobile-token
generate-mobile-tokenGenerate authentication token for mobile SDK.
Python:
def generate_mobile_token(client: Terra) -> str: """Generate token for mobile SDK initialization. Note: Token is generated for the account, not per-user. Use reference_id in the mobile SDK init to identify users. """ response = client.authentication.generateauthtoken() return response.token # Usage (backend endpoint) @app.route("/api/terra/mobile-token", methods=["POST"]) @login_required def get_mobile_token(): token = generate_mobile_token(client=terra_client) # Pass reference_id to mobile SDK, not to token generation return jsonify({ "token": token, "reference_id": str(current_user.id) # For SDK init })
Token Expiration: 180 seconds (3 minutes), one-time use.
deauthenticate-user
deauthenticate-userRemove user and revoke data access.
Python:
def deauthenticate_user(client: Terra, user_id: str) -> bool: """Deauthenticate user and remove their data.""" response = client.authentication.deauthenticateuser(user_id=user_id) return response.success # Usage success = deauthenticate_user(client, "terra_user_abc123") if success: print("User deauthenticated successfully")
list-integrations
list-integrationsGet all available provider integrations.
Python:
def list_integrations(client: Terra) -> list: """List all available Terra integrations.""" response = client.integrations.fetch() integrations = [] for integration in response.integrations: integrations.append({ "name": integration.name, "resource": integration.resource, "logo_url": integration.logo_url }) return integrations # Usage providers = list_integrations(client) for p in providers: print(f"{p['name']}: {p['resource']}")
REST API Headers
All REST API calls require these headers:
dev-id: <YOUR_DEV_ID> x-api-key: <YOUR_API_KEY> Content-Type: application/json
cURL Example:
curl -X GET "https://api.tryterra.co/v2/integrations" \ -H "dev-id: botaniqalmedtech-testing-SjyfjtG33s" \ -H "x-api-key: _W7Pm-kAaIf1GA_Se21NnzCaFZjg3Izc"
Security Best Practices
- Never expose API keys in frontend/mobile apps
- Use environment variables for credentials
- Generate mobile tokens on backend only
- Use HTTPS for all redirect URLs
- Rotate keys if compromised (contact Terra support)
- Different keys per environment (testing/staging/production)
Webhook Signing Secret
Each environment has a unique signing secret for webhook verification:
- Found in Terra Dashboard → Destinations → Webhooks
- Used for HMAC-SHA256 signature verification
- See
skill for implementationterra-webhooks
Session Lifecycle
| Token Type | Expiration | Notes |
|---|---|---|
| Widget Session | 15 minutes | URL valid until used or expired |
| Mobile SDK Token | 3 minutes | One-time use, generate per connection |
| OAuth Tokens | Auto-refresh | Terra manages automatically |
| API Keys | Never | Rotate manually if needed |
API Base URLs
| Environment | Base URL |
|---|---|
| Production API | |
| Widget | |
| Streaming | |
Related Skills
- terra-connections: Connect users to wearables
- terra-data: Retrieve health data
- terra-webhooks: Handle real-time events
- terra-sdk: SDK integration patterns