Skip to content

Latest commit

 

History

History
409 lines (354 loc) · 11.1 KB

File metadata and controls

409 lines (354 loc) · 11.1 KB
title API Keys
icon key
description Manage your Developer API keys

Endpoints

List all keys Create new key Revoke key Developer API keys are self-service: while signed in to Omi, open **Developer → API Keys** to create, list, and revoke your keys. The lifecycle endpoints below use that signed-in Omi/Firebase session; an `omi_dev_...` key cannot create, list, or revoke keys itself.

List API Keys

Retrieve all your developer API keys This endpoint requires your signed-in Omi/Firebase session. The secret key values are not returned (only the prefix is shown). ```bash curl -H "Authorization: Bearer $FIREBASE_ID_TOKEN" \ "https://api.omi.me/v1/dev/keys" ``` ```python import requests
response = requests.get(
    "https://api.omi.me/v1/dev/keys",
    headers={"Authorization": f"Bearer {firebase_id_token}"}
)
keys = response.json()
```
```javascript const response = await fetch( "https://api.omi.me/v1/dev/keys", { headers: { Authorization: `Bearer ${firebaseIdToken}` } } ); const keys = await response.json(); ``` ```json [ { "id": "key_123abc", "name": "My Analytics Dashboard", "key_prefix": "omi_dev_abc123", "created_at": "2025-01-15T10:30:00Z", "last_used_at": "2025-01-20T14:22:00Z", "scopes": ["conversations:read", "memories:read"] }, { "id": "key_456def", "name": "Automation Script", "key_prefix": "omi_dev_def456", "created_at": "2025-01-18T09:00:00Z", "last_used_at": null, "scopes": ["memories:read"] } ] ``` | Field | Type | Description | |-------|------|-------------| | `id` | string | Unique key identifier (used for deletion) | | `name` | string | Descriptive name you gave the key | | `key_prefix` | string | First part of the key (for identification) | | `created_at` | datetime | When the key was created | | `last_used_at` | datetime | When the key was last used (null if never used) | | `scopes` | array | Permissions assigned to the key |

Create API Key

Create a new developer API key Create keys from the signed-in Omi web app. The REST endpoint is the same self-service flow and requires a Firebase ID token, not an existing `omi_dev_...` key. The new secret is returned only once. | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | `name` | string | **Yes** | Descriptive name for the key | | `scopes` | array of strings | No | Permissions for the key. If omitted, the key receives the read-only scopes. | ```bash curl -X POST "https://api.omi.me/v1/dev/keys" \ -H "Authorization: Bearer $FIREBASE_ID_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name": "My New Integration", "scopes": ["memories:read"]}' ``` ```python import requests
response = requests.post(
    "https://api.omi.me/v1/dev/keys",
    headers={
        "Authorization": f"Bearer {firebase_id_token}",
        "Content-Type": "application/json"
    },
    json={"name": "My New Integration", "scopes": ["memories:read"]}
)
new_key = response.json()
print(f"Store this key securely: {new_key['key']}")
```
```javascript const response = await fetch( "https://api.omi.me/v1/dev/keys", { method: "POST", headers: { Authorization: `Bearer ${firebaseIdToken}`, "Content-Type": "application/json" }, body: JSON.stringify({ name: "My New Integration", scopes: ["memories:read"] }) } ); const newKey = await response.json(); console.log(`Store this key securely: ${newKey.key}`); ``` ```json { "id": "key_789ghi", "name": "My New Integration", "key_prefix": "omi_dev_ghi789", "key": "omi_dev_ghi789_full_secret_key_here", "created_at": "2025-01-20T15:00:00Z", "last_used_at": null, "scopes": ["memories:read"] } ``` The full API key (`key` field) is only returned once during creation. Store it securely immediately - you won't be able to see it again!

Scopes

Choose the least-privileged scopes needed by your integration:

  • Read: conversations:read, memories:read, action_items:read, goals:read
  • Write: conversations:write, memories:write, action_items:write, goals:write

Memory scopes authorize the key, but they do not bypass the account-level Developer Memory API readiness gate. See Memories for that availability contract.


Revoke API Key

Revoke (delete) a specific API key permanently | Parameter | Type | Description | |-----------|------|-------------| | `key_id` | string | The ID of the key to revoke | ```bash curl -X DELETE "https://api.omi.me/v1/dev/keys/key_789ghi" \ -H "Authorization: Bearer $FIREBASE_ID_TOKEN" ``` ```python import requests
response = requests.delete(
    f"https://api.omi.me/v1/dev/keys/key_789ghi",
    headers={"Authorization": f"Bearer {firebase_id_token}"}
)
if response.status_code == 204:
    print("Key revoked successfully")
```
```javascript const response = await fetch( "https://api.omi.me/v1/dev/keys/key_789ghi", { method: "DELETE", headers: { Authorization: `Bearer ${firebaseIdToken}` } } ); if (response.status === 204) { console.log("Key revoked successfully"); } ``` ``` 204 No Content ``` If a key is compromised, revoke it immediately and create a new one.

Best Practices

Name keys after their purpose (e.g., "Analytics Dashboard", "Zapier Integration") Create separate keys for different apps so you can revoke them independently Check `last_used_at` to identify unused or potentially compromised keys Periodically create new keys and revoke old ones

Use Case: Key Management Script

```python import requests
API_KEY = "omi_dev_your_api_key"
headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

def list_keys():
    """List all API keys"""
    response = requests.get(
        "https://api.omi.me/v1/dev/keys",
        headers=headers
    )
    return response.json()

def create_key(name):
    """Create a new API key"""
    response = requests.post(
        "https://api.omi.me/v1/dev/keys",
        headers=headers,
        json={"name": name}
    )
    return response.json()

def revoke_key(key_id):
    """Revoke an API key"""
    response = requests.delete(
        f"https://api.omi.me/v1/dev/keys/{key_id}",
        headers=headers
    )
    return response.status_code == 204

# List existing keys
print("Current API keys:")
for key in list_keys():
    last_used = key.get("last_used_at", "Never")
    print(f"  - {key['name']} ({key['key_prefix']}...) - Last used: {last_used}")

# Create a new key
print("\nCreating new key...")
new_key = create_key("Test Integration")
print(f"Created: {new_key['name']}")
print(f"Key: {new_key['key']}")  # Store this securely!

# Revoke a key (example)
# if revoke_key("key_123abc"):
#     print("Key revoked successfully")
```
```javascript const API_KEY = process.env.OMI_API_KEY; const headers = { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json" };
async function listKeys() {
  const response = await fetch("https://api.omi.me/v1/dev/keys", { headers });
  return response.json();
}

async function createKey(name) {
  const response = await fetch("https://api.omi.me/v1/dev/keys", {
    method: "POST",
    headers,
    body: JSON.stringify({ name })
  });
  return response.json();
}

async function revokeKey(keyId) {
  const response = await fetch(`https://api.omi.me/v1/dev/keys/${keyId}`, {
    method: "DELETE",
    headers
  });
  return response.status === 204;
}

// List existing keys
console.log("Current API keys:");
const keys = await listKeys();
keys.forEach(key => {
  const lastUsed = key.last_used_at || "Never";
  console.log(`  - ${key.name} (${key.key_prefix}...) - Last used: ${lastUsed}`);
});

// Create a new key
console.log("\nCreating new key...");
const newKey = await createKey("Test Integration");
console.log(`Created: ${newKey.name}`);
console.log(`Key: ${newKey.key}`);  // Store this securely!

// Revoke a key (example)
// if (await revokeKey("key_123abc")) {
//   console.log("Key revoked successfully");
// }
```

Managing Keys in the App

You can also manage API keys directly in the Omi app:

Launch the Omi app on your device Go to **Settings → Developer** Under "Developer API Keys" you can: - View all your keys - Create new keys - Delete existing keys Keys created in the app and via the API are the same - you can manage them from either place.