openapi: 3.1.0 info: title: Fast ACCOUNT_COSTS METABASE API version: 0.1.0 tags: - name: METABASE paths: /metabase/auth/metabase/token: post: tags: - METABASE summary: Generate Metabase Token description: "Generate a signed JWT token for Metabase embedded analytics.\n\nThis endpoint creates a JWT token that can be used with Metabase's\nembedded analytics feature to authenticate users and control access\nto dashboards and data.\n\nArgs:\n request: MetabaseJWTRequest containing optional groups and expiration\n current_user: The authenticated user from the request\n\nReturns:\n dict: Contains the signed JWT token with user info from request" operationId: generate_metabase_token_metabase_auth_metabase_token_post requestBody: content: application/json: schema: $ref: '#/components/schemas/MetabaseJWTRequest' required: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MetabaseJWTResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - HTTPBearer: [] - HTTPBearer: [] /metabase/dashboards: get: tags: - METABASE summary: Get Tenant Dashboards description: "Get paginated dashboards from local database with advanced filtering and sorting.\n\nThis endpoint fetches dashboard metadata from the local database\nthat was previously synced from Metabase by the sync worker.\n\nArgs:\n page: Page number (starts from 1)\n page_size: Number of dashboards per page (max 100)\n search: Search term for dashboard name/description\n tags: Filter by specific tags\n collection_ids: Filter by collection IDs\n collection_names: Filter by collection names\n created_after: ISO date string - filter dashboards created after this date\n created_before: ISO date string - filter dashboards created before this date\n updated_after: ISO date string - filter dashboards updated after this date\n updated_before: ISO date string - filter dashboards updated before this date\n has_description: Filter dashboards with/without descriptions\n archived: Include/exclude archived dashboards\n sort_by: Sort by field: name, created_at, updated_at, collection_name\n sort_order: Sort order: asc, desc\n\nReturns:\n dict: Contains the filtered, sorted, and paginated dashboards for the current tenant" operationId: get_tenant_dashboards_metabase_dashboards_get security: - HTTPBearer: [] - HTTPBearer: [] parameters: - name: page in: query required: false schema: type: integer minimum: 1 description: Page number (starts from 1) default: 1 title: Page description: Page number (starts from 1) - name: page_size in: query required: false schema: type: integer maximum: 100 minimum: 1 description: Number of dashboards per page (max 100) default: 10 title: Page Size description: Number of dashboards per page (max 100) - name: search in: query required: false schema: anyOf: - type: string - type: 'null' description: Search term for dashboard name/description title: Search description: Search term for dashboard name/description - name: tags in: query required: false schema: anyOf: - type: array items: type: string - type: 'null' description: Filter by specific tags title: Tags description: Filter by specific tags - name: collection_ids in: query required: false schema: anyOf: - type: array items: type: integer - type: 'null' description: Filter by collection IDs title: Collection Ids description: Filter by collection IDs - name: collection_names in: query required: false schema: anyOf: - type: array items: type: string - type: 'null' description: Filter by collection names title: Collection Names description: Filter by collection names - name: created_after in: query required: false schema: anyOf: - type: string - type: 'null' description: ISO date string - filter dashboards created after this date title: Created After description: ISO date string - filter dashboards created after this date - name: created_before in: query required: false schema: anyOf: - type: string - type: 'null' description: ISO date string - filter dashboards created before this date title: Created Before description: ISO date string - filter dashboards created before this date - name: updated_after in: query required: false schema: anyOf: - type: string - type: 'null' description: ISO date string - filter dashboards updated after this date title: Updated After description: ISO date string - filter dashboards updated after this date - name: updated_before in: query required: false schema: anyOf: - type: string - type: 'null' description: ISO date string - filter dashboards updated before this date title: Updated Before description: ISO date string - filter dashboards updated before this date - name: has_description in: query required: false schema: anyOf: - type: boolean - type: 'null' description: Filter dashboards with/without descriptions title: Has Description description: Filter dashboards with/without descriptions - name: archived in: query required: false schema: anyOf: - type: boolean - type: 'null' description: Include/exclude archived dashboards title: Archived description: Include/exclude archived dashboards - name: sort_by in: query required: false schema: anyOf: - type: string - type: 'null' description: 'Sort by field: name, created_at, updated_at, collection_name' default: updated_at title: Sort By description: 'Sort by field: name, created_at, updated_at, collection_name' - name: sort_order in: query required: false schema: anyOf: - type: string - type: 'null' description: 'Sort order: asc, desc' default: desc title: Sort Order description: 'Sort order: asc, desc' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/DashboardsResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /metabase/sync-dashboard-metadata: post: tags: - METABASE summary: Sync Dashboard Metadata description: "Sync Metabase dashboard metadata from Airflow DAG to local database.\n\nThis endpoint receives collections and dashboards data from an Airflow DAG\nand stores the metadata in the local PostgreSQL database for the specified tenant.\n\nArgs:\n request: SyncDashboardMetadataRequest containing tenant, collections, dashboards, and fetch timestamp\n\nReturns:\n SyncDashboardMetadataResponse with sync operation results" operationId: sync_dashboard_metadata_metabase_sync_dashboard_metadata_post requestBody: content: application/json: schema: $ref: '#/components/schemas/SyncDashboardMetadataRequest' required: true responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/SyncDashboardMetadataResponse' - $ref: '#/components/schemas/SyncDashboardMetadataErrorResponse' title: Response Sync Dashboard Metadata Metabase Sync Dashboard Metadata Post '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' deprecated: true security: - HTTPBearer: [] - HTTPBearer: [] /metabase/dashboards/{dashboard_id}: get: tags: - METABASE summary: Get Dashboard By Id description: "Get a specific dashboard by ID from the local database.\n\nThis endpoint retrieves dashboard metadata for a specific dashboard ID\nthat was previously synced from Metabase.\n\nArgs:\n dashboard_id: The ID of the dashboard to retrieve\n\nReturns:\n MetabaseDashboardDetail with dashboard information" operationId: get_dashboard_by_id_metabase_dashboards__dashboard_id__get security: - HTTPBearer: [] - HTTPBearer: [] parameters: - name: dashboard_id in: path required: true schema: type: integer title: Dashboard Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/MetabaseDashboardDetail' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /metabase/dashboards/sync-all: post: tags: - METABASE summary: Trigger Sync All Dashboards description: 'Trigger the Celery worker to sync Metabase dashboards for all tenants. Returns HTTP 202 with queued task id so the UI can track it.' operationId: trigger_sync_all_dashboards_metabase_dashboards_sync_all_post responses: '200': description: Successful Response content: application/json: schema: additionalProperties: true type: object title: Response Trigger Sync All Dashboards Metabase Dashboards Sync All Post security: - HTTPBearer: [] - HTTPBearer: [] /metabase/has-tag: get: tags: - METABASE summary: Has Dashboard Tag description: "Check whether the provided tag exists in any `SpacesDashboard` for the current tenant (case-insensitive).\n\nArgs:\n tag: The tag to check for\n\nReturns:\n True if present (case-insensitive), else False" operationId: has_dashboard_tag_metabase_has_tag_get security: - HTTPBearer: [] - HTTPBearer: [] parameters: - name: tag in: query required: true schema: type: string minLength: 1 description: Tag to check for in dashboards title: Tag description: Tag to check for in dashboards responses: '200': description: Successful Response content: application/json: schema: type: boolean title: Response Has Dashboard Tag Metabase Has Tag Get '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' components: schemas: SyncDashboardMetadataRequest: properties: tenant_name: type: string title: Tenant Name collections: items: $ref: '#/components/schemas/MetabaseCollectionSync' type: array title: Collections dashboards: items: $ref: '#/components/schemas/MetabaseDashboardSync' type: array title: Dashboards fetch_timestamp: type: string title: Fetch Timestamp type: object required: - tenant_name - collections - dashboards - fetch_timestamp title: SyncDashboardMetadataRequest MetabaseCollectionSync: properties: id: type: integer title: Id name: type: string title: Name description: anyOf: - type: string - type: 'null' title: Description color: anyOf: - type: string - type: 'null' title: Color parent_id: anyOf: - type: integer - type: 'null' title: Parent Id personal_owner_id: anyOf: - type: integer - type: 'null' title: Personal Owner Id created_at: anyOf: - type: string - type: 'null' title: Created At updated_at: anyOf: - type: string - type: 'null' title: Updated At archived: anyOf: - type: boolean - type: 'null' title: Archived slug: anyOf: - type: string - type: 'null' title: Slug location: anyOf: - type: string - type: 'null' title: Location namespace: anyOf: - type: string - type: 'null' title: Namespace authority_level: anyOf: - type: string - type: 'null' title: Authority Level type: anyOf: - type: string - type: 'null' title: Type type: object required: - id - name title: MetabaseCollectionSync MetabaseDashboardSync: properties: id: type: integer title: Id name: type: string title: Name description: anyOf: - type: string - type: 'null' title: Description collection_id: anyOf: - type: integer - type: 'null' title: Collection Id collection_position: anyOf: - type: integer - type: 'null' title: Collection Position creator_id: anyOf: - type: integer - type: 'null' title: Creator Id created_at: anyOf: - type: string - type: 'null' title: Created At updated_at: anyOf: - type: string - type: 'null' title: Updated At archived: anyOf: - type: boolean - type: 'null' title: Archived public_uuid: anyOf: - type: string - type: 'null' title: Public Uuid made_public_by_id: anyOf: - type: integer - type: 'null' title: Made Public By Id enable_embedding: anyOf: - type: boolean - type: 'null' title: Enable Embedding embedding_params: anyOf: - additionalProperties: true type: object - type: 'null' title: Embedding Params caveats: anyOf: - type: string - type: 'null' title: Caveats points_of_interest: anyOf: - type: string - type: 'null' title: Points Of Interest show_in_getting_started: anyOf: - type: boolean - type: 'null' title: Show In Getting Started position: anyOf: - type: integer - type: 'null' title: Position parameters: anyOf: - items: additionalProperties: true type: object type: array - type: 'null' title: Parameters tags: anyOf: - items: type: string type: array - type: 'null' title: Tags auto_apply_filters: anyOf: - type: boolean - type: 'null' title: Auto Apply Filters cache_field_values_schedule: anyOf: - type: string - type: 'null' title: Cache Field Values Schedule cache_duration: anyOf: - type: integer - type: 'null' title: Cache Duration type: object required: - id - name title: MetabaseDashboardSync MetabaseJWTResponse: properties: jwt: type: string title: Jwt type: object required: - jwt title: MetabaseJWTResponse ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type type: object required: - loc - msg - type title: ValidationError HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError MetabaseJWTRequest: properties: groups: anyOf: - items: {} type: array - type: 'null' title: Groups default: [] exp: anyOf: - type: integer - type: 'null' title: Exp type: object title: MetabaseJWTRequest CollectionOption: properties: id: type: integer title: Id name: type: string title: Name count: type: integer title: Count type: object required: - id - name - count title: CollectionOption MetabaseDashboardDetail: properties: id: type: integer title: Id name: type: string title: Name description: anyOf: - type: string - type: 'null' title: Description created_at: type: string title: Created At updated_at: type: string title: Updated At tenant_id: anyOf: - type: string - type: 'null' title: Tenant Id type: object required: - id - name - created_at - updated_at title: MetabaseDashboardDetail MetabaseDashboard: properties: id: type: integer title: Id name: type: string title: Name description: anyOf: - type: string - type: 'null' title: Description created_at: anyOf: - type: string - type: 'null' title: Created At updated_at: anyOf: - type: string - type: 'null' title: Updated At tags: anyOf: - items: type: string type: array - type: 'null' title: Tags attributes: anyOf: - additionalProperties: true type: object - type: 'null' title: Attributes dashboard_id: anyOf: - type: integer - type: 'null' title: Dashboard Id collection_id: anyOf: - type: integer - type: 'null' title: Collection Id collection_name: anyOf: - type: string - type: 'null' title: Collection Name dashboard_metadata: anyOf: - additionalProperties: true type: object - type: 'null' title: Dashboard Metadata collection_metadata: anyOf: - additionalProperties: true type: object - type: 'null' title: Collection Metadata creator: anyOf: - $ref: '#/components/schemas/Creator' - type: 'null' view_count: anyOf: - type: integer - type: 'null' title: View Count last_viewed_at: anyOf: - type: string - type: 'null' title: Last Viewed At tenant_name: anyOf: - type: string - type: 'null' title: Tenant Name type: object required: - id - name title: MetabaseDashboard SyncDashboardMetadataResponse: properties: success: type: boolean title: Success message: type: string title: Message dashboards_synced: type: integer title: Dashboards Synced dashboards_updated: type: integer title: Dashboards Updated dashboards_deleted: type: integer title: Dashboards Deleted total_dashboards: type: integer title: Total Dashboards tenant: type: string title: Tenant processing_time_seconds: type: number title: Processing Time Seconds type: object required: - success - message - dashboards_synced - dashboards_updated - dashboards_deleted - total_dashboards - tenant - processing_time_seconds title: SyncDashboardMetadataResponse SyncDashboardMetadataErrorResponse: properties: success: type: boolean title: Success error: type: string title: Error tenant: type: string title: Tenant type: object required: - success - error - tenant title: SyncDashboardMetadataErrorResponse Creator: properties: id: anyOf: - type: integer - type: 'null' title: Id email: anyOf: - type: string - type: 'null' title: Email first_name: anyOf: - type: string - type: 'null' title: First Name last_name: anyOf: - type: string - type: 'null' title: Last Name common_name: anyOf: - type: string - type: 'null' title: Common Name type: object title: Creator DashboardsResponse: properties: dashboards: items: $ref: '#/components/schemas/MetabaseDashboard' type: array title: Dashboards count: type: integer title: Count total: type: integer title: Total page: type: integer title: Page page_size: type: integer title: Page Size total_pages: type: integer title: Total Pages has_next: type: boolean title: Has Next has_previous: type: boolean title: Has Previous available_tags: anyOf: - items: type: string type: array - type: 'null' title: Available Tags available_collections: anyOf: - items: $ref: '#/components/schemas/CollectionOption' type: array - type: 'null' title: Available Collections type: object required: - dashboards - count - total - page - page_size - total_pages - has_next - has_previous title: DashboardsResponse securitySchemes: HTTPBearer: type: http scheme: bearer