openapi: 3.2.0 info: title: User Tooltip API description: Api to manage roles and permissions of users version: 1.0.0 servers: - url: https://users.blng.ai description: Base URL declared by the provider in apis.yml (roadmap#122). tags: - name: User Tooltip paths: /users/{userId}/tooltips: get: tags: - User Tooltip summary: get tooltips to show to a user security: - cognitoUserAuth: - openid parameters: - name: userId in: path required: true schema: type: string description: Unique identifier for the User - name: device in: query schema: type: string description: Device type the tooltips are being requested for default: web enum: - web - ios - ipad - name: includeViewed in: query schema: type: boolean description: Whether to include already viewed tooltip flows or not in the response default: false responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/TooltipResponse' '400': description: Bad Request '404': description: User not found '500': description: Internal Server Error /users/{userId}/tooltips/resetAll: post: tags: - User Tooltip summary: Resets all viewed tooltips for a user security: - cognitoUserAuth: - openid parameters: - name: userId in: path required: true schema: type: string description: Unique identifier for the User responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/User' '400': description: Bad Request '404': description: User not found '500': description: Internal Server Error components: schemas: UserTooltipFlow: type: object properties: id: type: string description: Unique id for the flow name: type: string description: Name of the flow pages: type: array description: What pages/views the tooltip flow is designed for items: type: string devices: type: array description: What devices the tooltip flow is designed for items: type: string enum: - web - ios - ipad tooltipRegistrations: type: array items: $ref: '#/components/schemas/TooltipRegistration' seenByUser: type: boolean description: Whether this tooltip flow was seen by the user or not TooltipRegistration: type: object properties: tooltip: $ref: '#/components/schemas/Tooltip' attachmentPoint: type: object description: How the tooltip will be attached to the interface for different devices properties: web: type: object properties: dataTooltip: type: string description: data-tooltip attribute that this tooltip will attach to side: type: string enum: - top - right - bottom - left - over align: type: string enum: - start - center - end ios: type: object ipad: type: object TooltipResponse: type: object properties: tooltipFlows: type: array items: $ref: '#/components/schemas/UserTooltipFlow' Tooltip: type: object properties: id: type: string description: Unique id for the tooltip name: type: string description: Name of the tooltip icon: type: string description: Icon to show next to the title title: type: string description: Title for the tooltip description: type: string description: Contents for the tooltip User: type: object properties: userId: type: string description: Unique identifier for the user email: type: string description: Email of the user firstName: type: string description: First name of the user lastName: type: string description: Last name of the user companyName: type: string description: Optional company name (app metadata, not auth) profilePictureUrl: type: string description: Profile image URL (e.g. from federated IdP), synced on login stripeCustomerId: type: string description: Stripe customer ID createdAt: type: string format: date-time description: Timestamp of when the user was created updatedAt: type: string format: date-time description: Timestamp of the last update to user welcomeEmailSent: type: boolean description: Whether the welcome email has been sent deprecated: true welcomeEmailStatus: type: string enum: - SENT - NOT_SENT - IN_PROGRESS description: Status of the welcome email tooltipFlowIdsViewed: type: array items: type: string description: Id of all tooltip flows marked as viewed activeWorkspaceId: type: string format: uuid description: Current workspace context (multi-tenancy); set via PUT /users/{userId}/active-workspace allowedWorkspaces: type: integer minimum: 1 description: 'Ops-only override (DynamoDB): max workspaces this user may own via POST /users/{userId}/workspaces. Omitted on normal users; overrides the stage default (typically 3). Not settable via public PUT /users.' marketingConsent: $ref: '#/components/schemas/MarketingConsentReceipt' marketingConsentPromptedAt: type: string format: date-time description: Set when the one-time consent prompt was shown and closed without an answer. Suppresses further prompting without recording a choice the user never made. Mutually exclusive with marketingConsent. Set via PUT /users/{userId}/marketing-consent. signUpPending: type: boolean enum: - true description: Present only while an account is still going through sign-up and has not resolved the marketing consent ask. Written by account creation, cleared by the first consent write, and absent on every row created before it was introduced. Not settable via any API. MarketingConsentReceipt: type: object description: Marketing opt-in receipt (GDPR consent provenance). Present only for users who made an explicit choice; optIn records that choice either way. Synced to HubSpot as the marketing_opt_in contact property. Absent for users who have never been asked or who dismissed the prompt. required: - optIn - timestamp - wordingVersion - captureLocation properties: optIn: type: boolean description: The user's choice timestamp: type: string format: date-time description: When the choice was captured. Server-stamped; never accepted from the caller. wordingVersion: type: string description: Version tag of the exact consent wording shown, so the receipt survives copy changes captureLocation: type: string description: Which surface captured the choice. `email-unsubscribe` and `email-spam-complaint` are withdrawals the recipient made against mail we sent, the first through an unsubscribe link and the second by reporting it to their provider. Both are recorded from the CRM's own subscription-change events rather than through this API. enum: - signup - first-login-prompt - settings - email-unsubscribe - email-spam-complaint securitySchemes: cognitoUserAuth: type: oauth2 description: Cognito authorization code flow for users flows: implicit: authorizationUrl: https://auth.app.blng.ai/oauth2/authorize scopes: email: email profile: profile openid: openid aws.cognito.signin.user.admin: aws.cognito.signin.user.admin machineBearerToken: type: http description: 'Cognito authorization code flow for billing token, request token with command like `curl -X POST https://auth.app.blng.ai/oauth2/token -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials&client_id=7arq76lejqmgq3qc556vr7rupn&client_secret=CLIENT_SECRET&scope=blng/billing"` ' scheme: bearer bearerFormat: JWT Access Token