{"openapi":"3.1.0","info":{"title":"Client API (SDK)","version":"1.0.0","description":"Customer-facing API (SDK key)."},"servers":[{"url":"https://api.motisig.ai/client","description":"API base (Firebase Hosting)"}],"components":{"securitySchemes":{"sdkKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Project SDK key (customer-facing)."}},"schemas":{"HealthResponse":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"service":{"type":"string"},"timestamp":{"type":"string"}},"required":["status","service","timestamp"]},"RegisterUserResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"userId":{"type":"string"},"anonymousId":{"type":"string"}},"required":["success","userId"]},"ErrorResponse":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"RegisterUserBody":{"type":"object","properties":{"id":{"type":"string","minLength":1},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"timezone":{"type":"string"},"locale":{"type":"string"},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]},"context":{"$ref":"#/components/schemas/ClientContext"},"tags":{"type":"array","items":{"type":"string"}},"customAttributes":{"type":"object","additionalProperties":{}},"pushTokens":{"type":"object","properties":{"expo":{"type":"array","items":{"type":"string"}},"fcm":{"type":"array","items":{"type":"string"}},"apns":{"type":"array","items":{"type":"string"}}}},"pushSubscriptions":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android","web"]},"type":{"type":"string","enum":["expo","fcm","apns","webpush"]},"token":{"type":"string"},"permission":{"type":"string","enum":["granted","declined","unknown"]},"enabled":{"type":"boolean"},"state":{"type":"string","enum":["valid","invalid"]}},"required":["platform","type","token"]}}}},"required":["id"]},"ClientContext":{"type":"object","properties":{"locale":{"type":"string"},"timezone":{"type":"string"},"location":{"$ref":"#/components/schemas/ClientLocation"},"device":{"$ref":"#/components/schemas/ClientDevice"}}},"ClientLocation":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"},"accuracyMeters":{"type":"number"}},"required":["latitude","longitude"]},"ClientDevice":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android","web"]},"userAgent":{"type":"string"},"browser":{"type":"string"},"os":{"type":"string"},"deviceModel":{"type":"string"},"screenWidth":{"type":"integer"},"screenHeight":{"type":"integer"}}},"SuccessResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]},"UpdateUserBody":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"timezone":{"type":"string"},"locale":{"type":"string"}},"additionalProperties":false},"TagsBody":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]}}},"AttributesBody":{"type":"object","properties":{"attributes":{"type":"object","additionalProperties":{}},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]}}},"AttributeKeysBody":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"string"}},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]}}},"LegacyPushTokenBody":{"type":"object","properties":{"platform":{"type":"string","enum":["expo","fcm","apns","webpush"]},"token":{"type":"string","minLength":1}},"required":["platform","token"]},"PushSubscriptionUpsertBody":{"type":"object","properties":{"devicePlatform":{"type":"string","enum":["ios","android","web"]},"pushType":{"type":"string","enum":["expo","fcm","apns","webpush"]},"token":{"type":"string","minLength":1},"permission":{"type":"string","enum":["granted","declined","unknown"]},"enabled":{"type":"boolean"},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]}},"required":["devicePlatform","pushType","token"]},"PushSubscriptionPatchBody":{"type":"object","properties":{"devicePlatform":{"type":"string","enum":["ios","android","web"]},"pushType":{"type":"string","enum":["expo","fcm","apns","webpush"]},"token":{"type":"string","minLength":1},"enabled":{"type":"boolean"},"permission":{"type":"string","enum":["granted","declined","unknown"]},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]}},"required":["devicePlatform","pushType","token"],"additionalProperties":false},"PushSubscriptionRemoveBody":{"type":"object","properties":{"devicePlatform":{"type":"string","enum":["ios","android","web"]},"pushType":{"type":"string","enum":["expo","fcm","apns","webpush"]},"token":{"type":"string","minLength":1},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]}},"required":["devicePlatform","pushType","token"]},"TriggerEventResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"message":{"type":"string"}},"required":["success","message"]},"TriggerEventBody":{"type":"object","properties":{"userId":{"type":"string"},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]},"eventName":{"type":"string"},"occurredAt":{"type":"string","format":"date-time"},"context":{"$ref":"#/components/schemas/ClientContext"},"platform":{"type":"string","enum":["ios","android","web"]},"appVersion":{"type":"string"},"sdkVersion":{"type":"string"},"sessionId":{"type":"string"},"eventData":{}},"required":["eventName"]},"ActivityBatchResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"recorded":{"type":"integer"}},"required":["success","recorded"]},"ActivityBatchBody":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"anonymousId":{"type":"string"},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"]},"eventName":{"type":"string","minLength":1},"occurredAt":{"type":"string","format":"date-time"},"context":{"$ref":"#/components/schemas/ClientContext"},"platform":{"type":"string","enum":["ios","android","web"]},"appVersion":{"type":"string"},"sdkVersion":{"type":"string"},"sessionId":{"type":"string"},"eventData":{"type":"object","additionalProperties":{}}},"required":["eventName"]},"minItems":1,"maxItems":50}},"required":["events"]},"TrackClickBody":{"type":"object","properties":{"messageId":{"type":"string"},"userId":{"type":"string","deprecated":true},"anonymousId":{"type":"string","deprecated":true},"anonymousIdProvider":{"type":"string","enum":["fingerprintjs","internal"],"deprecated":true},"isForeground":{"type":"boolean"}},"required":["messageId"]},"TrackOpenBody":{"type":"object","properties":{"messageId":{"type":"string"},"isForeground":{"type":"boolean"}},"required":["messageId"]},"WebPushPublicKeyResponse":{"type":"object","properties":{"vapidPublicKey":{"type":["string","null"]}},"required":["vapidPublicKey"]}},"parameters":{}},"paths":{"/health":{"get":{"tags":["Health"],"summary":"Health check","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/t/open/{projectId}/{messageId}":{"get":{"tags":["EmailTracking"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"messageId","in":"path"}],"responses":{"200":{"description":"Tracking pixel"}}}},"/t/click/{projectId}/{messageId}/{linkId}":{"get":{"tags":["EmailTracking"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"messageId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"linkId","in":"path"},{"schema":{"type":"string"},"required":false,"name":"url","in":"query"}],"responses":{"302":{"description":"Redirect to target URL"}}}},"/users":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterUserBody"}}}},"responses":{"200":{"description":"Identified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterUserResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/users/{userId}":{"patch":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/users/{userId}/tags":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagsBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagsBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/users/{userId}/attributes":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributesBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributeKeysBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/users/{userId}/push-tokens":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyPushTokenBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyPushTokenBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/users/{userId}/push-subscriptions":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSubscriptionUpsertBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"patch":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSubscriptionPatchBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSubscriptionRemoveBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/users/{userId}/ping":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/events":{"post":{"tags":["Events"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerEventBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerEventResponse"}}}}}}},"/activity/batch":{"post":{"tags":["Activity"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityBatchBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityBatchResponse"}}}}}}},"/track/click":{"post":{"tags":["Track"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackClickBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/track/open":{"post":{"tags":["Track"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackOpenBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/web-config":{"get":{"tags":["WebPush"],"security":[{"sdkKeyHeader":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebPushPublicKeyResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/users":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterUserBody"}}}},"responses":{"200":{"description":"Identified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterUserResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/users/{userId}":{"patch":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/users/{userId}/tags":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagsBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagsBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/users/{userId}/attributes":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributesBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributeKeysBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/users/{userId}/push-tokens":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyPushTokenBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyPushTokenBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/users/{userId}/push-subscriptions":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSubscriptionUpsertBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"patch":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSubscriptionPatchBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}},"delete":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushSubscriptionRemoveBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/users/{userId}/ping":{"post":{"tags":["Users"],"security":[{"sdkKeyHeader":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/events":{"post":{"tags":["Events"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerEventBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerEventResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/activity/batch":{"post":{"tags":["Activity"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityBatchBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityBatchResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/track/click":{"post":{"tags":["Track"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackClickBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/track/open":{"post":{"tags":["Track"],"security":[{"sdkKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackOpenBody"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/organizations/{orgId}/projects/{projectId}/web-config":{"get":{"tags":["WebPush"],"security":[{"sdkKeyHeader":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebPushPublicKeyResponse"}}}}}}}},"webhooks":{}}