Maia-analytics project API

The project API from Maia-analytics — 15 operation(s) for project.

Operations 21

GET /api/v1/project/all Get All Projects #
POST /api/v1/project/sandbox Create Sandbox Project #
POST /api/v1/project/sandbox/from-feature Create Sandbox Project From Feature #
POST /api/v1/project/sandbox/from-features Create Sandbox Project From Features #
POST /api/v1/project/address/resolve Resolve Address #
POST /api/v1/project/address/resolve-many Resolve Addresses Batch #
GET /api/v1/project/address/feature-geometry Get Address Feature Geometry #
POST /api/v1/project/sandbox/warm-county Warm County Boundary #
GET /api/v1/project/{project_id} Get Project #
PUT /api/v1/project/{project_id} Update Project #
DELETE /api/v1/project/{project_id} Delete Project #
PUT /api/v1/project/{project_id}/default-view Set Project Default View #
PATCH /api/v1/project/{project_id}/views/reorder Reorder Views #
PATCH /api/v1/project/{project_id}/views/{view_id} Update View #
DELETE /api/v1/project/{project_id}/views/{view_id} Delete View #
GET /api/v1/project/{project_id}/views Get Views #
POST /api/v1/project/{project_id}/views Create View #
GET /api/v1/project/{project_id}/chats Get Project Chat #
GET /api/v1/project/{project_id}/share Get Share Info #
POST /api/v1/project/{project_id}/share Generate Share Link #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/maia-analytics-project-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

maia-analytics-project-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: MAIA Ah Project API
  description: API for MAIA application (migrated from Firebase)
  version: 0.1.0
servers:
- url: https://api.maia-analytics.com
  description: Base URL declared by the provider in apis.yml (roadmap#122).
tags:
- name: project
paths:
  /api/v1/project/all:
    get:
      tags:
      - project
      summary: Get All Projects
      description: "Get all projects for the authenticated user.\n\nArgs:\n    project_service: Project service for business logic\n    user_profile: Current user's profile (for workspace role and can_edit)\n\nReturns:\n    List of projects visible to the user with can_edit computed per project"
      operationId: get_all_projects_api_v1_project_all_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectListResponse'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/sandbox:
    post:
      tags:
      - project
      summary: Create Sandbox Project
      description: 'Create a single-click county sandbox project pre-loaded with the

        county''s boundary layer.


        Two-phase: this handler runs phase 1 (validate FIPS, insert PENDING

        project row, return ``project_id``) synchronously and enqueues phase 2

        (Neon name resolve, CREATE MATERIALIZED VIEW, register boundary layer,

        flip status to READY) on the Celery `sandbox_boundary` queue. Celery is

        used instead of FastAPI ``BackgroundTasks`` so a Cloud Run instance

        restart between response and task completion can''t strand the project

        in ``PENDING`` — the broker persists the job until a worker acks.


        Workspace RBAC: rejects FIPS codes not in the user''s available

        geographies (403). FIPS not loaded into the workspace''s

        ``workspace_counties`` table is a 404 before any project row is

        inserted. Failures inside the background task mark the project

        ``status=FAILED`` (visible on the project page); the task itself retries

        with exponential backoff before reaching that state.'
      operationId: create_sandbox_project_api_v1_project_sandbox_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxProjectRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SandboxProjectResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/sandbox/from-feature:
    post:
      tags:
      - project
      summary: Create Sandbox Project From Feature
      description: 'Create a sandbox project from a confirmed resolved feature (address entry).


        The create-flow inversion: unlike ``POST /sandbox`` (county picked first),

        the county scope is *derived* from the matched feature before the project''s

        RLS role is provisioned. Two-phase — this handler derives scope, inserts the

        PENDING project + role synchronously, and enqueues the async layer seed;

        ``status`` flips to ``ready`` and the layer arrives via SSE.


        No ``available_geographies`` 403: the matched feature is in-coverage by

        construction (the resolver only searched this workspace''s loaded sandbox).

        Unknown ``feature_id`` → 404; a county somehow not loaded → 404 before any

        project row is inserted; a matched feature whose ``_county_fips`` is

        NULL/malformed (a sandbox data-integrity fault, not a caller error) → 422.'
      operationId: create_sandbox_project_from_feature_api_v1_project_sandbox_from_feature_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddressCreateFlowRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressProjectResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/sandbox/from-features:
    post:
      tags:
      - project
      summary: Create Sandbox Project From Features
      description: 'Create one sandbox project from several confirmed features (paste flow).


        The multi-feature twin of ``/sandbox/from-feature``: derives one shared county

        from every feature''s marker before inserting the project, then enqueues a single

        seed for all of them. Unknown ``feature_id`` → 404; a NULL/malformed marker →

        422; features spanning more than one county → 422 (a project is scoped to one

        county under RLS, so the paste must be split). ``status`` flips to ``ready`` and

        the layers arrive via SSE.'
      operationId: create_sandbox_project_from_features_api_v1_project_sandbox_from_features_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddressBatchCreateFlowRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressProjectResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/address/resolve:
    post:
      tags:
      - project
      summary: Resolve Address
      description: 'Resolve free text to ranked, label-hydrated candidates for address entry.


        Pre-project: bounded to ``request.county_fips`` when the caller picked a

        county first, otherwise across every county the caller''s workspace has

        loaded (the sandbox partition is the access control either way). A read

        failure surfaces as 503 rather than the raw error, which can carry a

        sandbox connection URI.'
      operationId: resolve_address_api_v1_project_address_resolve_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddressResolveRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressResolveResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/address/resolve-many:
    post:
      tags:
      - project
      summary: Resolve Addresses Batch
      description: 'Resolve a pasted handful of addresses in one batch for the paste review list.


        One typed outcome per input row in input order (matched / ambiguous /

        not_in_dataset / empty_input), county-bounded like the single resolve. Candidate

        labels for every row are hydrated in a single read, then re-split per row. A read

        failure surfaces as 503 rather than the raw error (which can carry a sandbox URI).'
      operationId: resolve_addresses_batch_api_v1_project_address_resolve_many_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddressResolveManyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressResolveManyResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/address/feature-geometry:
    get:
      tags:
      - project
      summary: Get Address Feature Geometry
      description: 'Drawable geometry + bbox for one resolved candidate, pre-project.


        404 covers both a malformed/unknown ``feature_id`` and a row with null

        geometry — either way there is nothing to draw. Read failures map to 503,

        mirroring ``/address/resolve``.'
      operationId: get_address_feature_geometry_api_v1_project_address_feature_geometry_get
      security:
      - FirebaseAuthMiddleware: []
      parameters:
      - name: source_table
        in: query
        required: true
        schema:
          $ref: '#/components/schemas/SourceTable'
      - name: feature_id
        in: query
        required: true
        schema:
          type: string
          title: Feature Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressFeatureGeometryResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/project/sandbox/warm-county:
    post:
      tags:
      - project
      summary: Warm County Boundary
      description: 'Pre-warm the boundary MV for a county without creating a project.


        Called from the picker the moment a user soft-selects a county, so

        the Neon roundtrip (TIGER GEOID lookup + CREATE MATERIALIZED VIEW +

        index) overlaps with prompt composition instead of blocking the

        subsequent project-create. Idempotent — the MV is workspace-scoped

        and deterministically named by ``county_fips``; concurrent warms are

        serialized inside ``ensure_county_boundary_mv`` by an advisory lock

        and the second caller fast-paths on the existing MV.


        Workspace RBAC mirrors ``create_sandbox_project``: FIPS not in the

        user''s available geographies → 403, FIPS not loaded into the

        workspace''s ``workspace_counties`` table → 404, FIPS not present in

        the workspace''s ``tiger_county`` table → 404. No project row is

        created on any path — the warm flow is read-only at the app-DB level.'
      operationId: warm_county_boundary_api_v1_project_sandbox_warm_county_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxWarmCountyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SandboxWarmCountyResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/{project_id}:
    get:
      tags:
      - project
      summary: Get Project
      description: 'Get a single project by ID.


        Requires read access (ownership, workspace membership, example, or admin

        view/write mode). Admin view mode forces can_edit=False; admin write mode

        forces can_edit=True. Both force is_owner=False.'
      operationId: get_project_api_v1_project__project_id__get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectResponse'
      security:
      - FirebaseAuthMiddleware: []
    put:
      tags:
      - project
      summary: Update Project
      description: "Update a project's basic information (name and/or description).\n\nArgs:\n    project_id: UUID of the project (validated to be owned by current user)\n    project_data: Project update parameters containing optional name/description\n    project_service: Project service for business logic\n\nReturns:\n    Response with success status, message, and updated project data\n\nRaises:\n    HTTPException: 404 if project not found or user doesn't own it\n    ValueError: If no fields to update are provided"
      operationId: update_project_api_v1_project__project_id__put
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectUpdate'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectUpdateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
    delete:
      tags:
      - project
      summary: Delete Project
      description: "Delete a project.\n\nArgs:\n    project_id: UUID of the project (validated to be owned by current user)\n    project_service: Project service for business logic\n\nReturns:\n    Dict with success status and message\n\nRaises:\n    HTTPException: 404 if project not found or user doesn't own it"
      operationId: delete_project_api_v1_project__project_id__delete
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectDeleteResponse'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/{project_id}/default-view:
    put:
      tags:
      - project
      summary: Set Project Default View
      description: "Set (or clear) the project's durable default view.\n\nThe default view is the view anonymous share-link visitors and first-time\nviewers land on when the URL carries no explicit ``?view=``. Settable by any\neditor (validated by the dependency).\n\nRaises:\n    HTTPException: 404 if project not found or the caller can't write it,\n        400 if ``view_id`` isn't one of the project's views."
      operationId: set_project_default_view_api_v1_project__project_id__default_view_put
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SetDefaultViewRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectUpdateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/{project_id}/views/reorder:
    patch:
      tags:
      - project
      summary: Reorder Views
      description: "Reorder a project's views to match the supplied id order.\n\nDeclared *before* the ``/{view_id}`` PATCH route: FastAPI matches routes in\ndeclaration order, so the literal ``reorder`` segment must register first or\n``{view_id}`` would capture it (``view_id=\"reorder\"``).\n\nArgs:\n    project_id: UUID of the project (validated to be owned by current user)\n    request: The full ordered list of view ids\n    view_service: View service for business logic\n\nReturns:\n    Response with success status and the views in their new order\n\nRaises:\n    HTTPException: 404 if project not found or user doesn't own it,\n        400 if ``view_ids`` isn't a permutation of the project's views."
      operationId: reorder_views_api_v1_project__project_id__views_reorder_patch
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ViewsReorderRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ViewsReorderResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/{project_id}/views/{view_id}:
    patch:
      tags:
      - project
      summary: Update View
      description: "Update a single view with partial data and atomic ownership validation.\n\nArgs:\n    project_id: UUID of the project (validated to be owned by current user)\n    view_id: String ID of the view to update\n    request: Request containing the partial view update data\n    view_service: View service for business logic\n\nReturns:\n    Response with success status and updated view data\n\nRaises:\n    HTTPException: 404 if project/view not found or user doesn't own it,\n        409 if ``expected_version`` is stale (the view changed concurrently)."
      operationId: update_view_api_v1_project__project_id__views__view_id__patch
      security:
      - FirebaseAuthMiddleware: []
      parameters:
      - name: view_id
        in: path
        required: true
        schema:
          type: string
          title: View Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ViewUpdateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ViewUpdateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
      - project
      summary: Delete View
      description: "Delete a view from a project.\n\nArgs:\n    project_id: UUID of the project (validated to be owned by current user)\n    view_id: String ID of the view to delete\n    view_service: View service for business logic\n\nReturns:\n    Response with success status and message\n\nRaises:\n    HTTPException: 404 if project/view not found or user doesn't own it"
      operationId: delete_view_api_v1_project__project_id__views__view_id__delete
      security:
      - FirebaseAuthMiddleware: []
      parameters:
      - name: view_id
        in: path
        required: true
        schema:
          type: string
          title: View Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ViewDeleteResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/project/{project_id}/views:
    get:
      tags:
      - project
      summary: Get Views
      description: "Get all views for a project.\n\nArgs:\n    project_id: UUID of the project (validated for read access - owned or example)\n    view_service: View service for business logic\n\nReturns:\n    Response containing list of views\n\nRaises:\n    HTTPException: 404 if project not found or user doesn't have access"
      operationId: get_views_api_v1_project__project_id__views_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ViewsGetResponse'
      security:
      - FirebaseAuthMiddleware: []
    post:
      tags:
      - project
      summary: Create View
      description: "Create a new view for a project.\n\nArgs:\n    project_id: UUID of the project (validated to be owned by current user)\n    request: Request containing the view to create\n    view_service: View service for business logic\n\nReturns:\n    Response with success status and created view data\n\nRaises:\n    HTTPException: 404 if project not found or user doesn't own it"
      operationId: create_view_api_v1_project__project_id__views_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ViewCreateRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ViewCreateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/{project_id}/chats:
    get:
      tags:
      - project
      summary: Get Project Chat
      description: "Get the chat for a specific project.\n\nArgs:\n    project_id: The ID of the project to get chat for (validated for read access).\n    agent_service: The AgentService instance (dependency).\n    user_repo: User repository for resolving sender display names.\n    project_repo: Project repository for checking project visibility.\n    user_profile: Current user's profile for internal status check.\n\nReturns:\n    The chat history for the project, or None if no chat exists.\n\nRaises:\n    HTTPException: 400 for validation errors.\n    HTTPException: 404 if project not found or user doesn't have access.\n    HTTPException: 500 for unexpected errors."
      operationId: get_project_chat_api_v1_project__project_id__chats_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatHistoryResponseSchema'
      security:
      - FirebaseAuthMiddleware: []
  /api/v1/project/{project_id}/share:
    get:
      tags:
      - project
      summary: Get Share Info
      description: "Get share link info for a project.\n\nReturns one of three states:\n- Never shared: is_shared=False, share=None\n- Previously shared (revoked): is_shared=False, share={is_active: False, ...}\n- Currently shared: is_shared=True, share={is_active: True, ...}\n\nAlso includes workspace context (name, member count, project visibility)\nfor the share dialog. Requires write access to the project.\n\nArgs:\n    project_id: UUID of the project (validated for write access)\n    user_profile: Current user's profile (for workspace_id)\n    share_service: ProjectShareService for share link operations\n\nReturns:\n    Share info with is_shared flag, optional share details, and workspace context"
      operationId: get_share_info_api_v1_project__project_id__share_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShareInfoResponse'
      security:
      - FirebaseAuthMiddleware: []
    post:
      tags:
      - project
      summary: Generate Share Link
      description: "Generate a share link for a project (idempotent).\n\nIf an active share link already exists, returns it. Otherwise creates\na new one with a unique token. Requires write access to the project.\n\nArgs:\n    project_id: UUID of the project (validated for write access)\n    share_service: ProjectShareService for share link operations\n\nReturns:\n    Share link details including full URL, token, and status"
      operationId: generate_share_link_api_v1_project__project_id__share_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShareLinkResponse'
      security:
      - FirebaseAuthMiddleware: []
    delete:
      tags:
      - project
      summary: Revoke Share Link
      description: "Revoke the active share link for a project.\n\nPermanently invalidates the current share token. Re-enabling sharing\nwill generate a new token (old links stay dead). Requires write access to the project.\n\nArgs:\n    project_id: UUID of the project (validated for write access)\n    share_service: ProjectShareService for share link operations\n\nReturns:\n    Success confirmation\n\nRaises:\n    HTTPException: 404 if no active share link exists"
      operationId: revoke_share_link_api_v1_project__project_id__share_delete
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShareRevokeResponse'
      security:
      - FirebaseAuthMiddleware: []
components:
  schemas:
    TextPart:
      properties:
        content:
          type: string
          title: Content
        id:
          anyOf:
          - type: string
          - type: 'null'
          title: Id
        provider_name:
          anyOf:
          - type: string
          - type: 'null'
          title: Provider Name
        provider_details:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Provider Details
        part_kind:
          type: string
          const: text
          title: Part Kind
          default: text
      type: object
      required:
      - content
      title: TextPart
      description: A plain text response from a model.
    ChatHistoryResponseSchema:
      properties:
        chat:
          anyOf:
          - $ref: '#/components/schemas/ChatHistorySchema'
          - type: 'null'
          description: The chat history for the project, or None if no chat exists.
        users:
          additionalProperties:
            $ref: '#/components/schemas/ChatUserInfo'
          type: object
          title: Users
          description: Map of user_id to display info for message attribution.
      type: object
      required:
      - chat
      title: ChatHistoryResponseSchema
      description: Schema for the chat history of a project.
    ChatHistorySchema:
      properties:
        project_id:
          type: string
          title: Project Id
        chat_history:
          items:
            oneOf:
            - $ref: '#/components/schemas/ModelRequest'
            - $ref: '#/components/schemas/ModelResponse'
            discriminator:
              propertyName: kind
              mapping:
                request: '#/components/schemas/ModelRequest'
                response: '#/components/schemas/ModelResponse'
          type: array
          title: Chat History
        active_run_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Active Run Id
          description: Workflow id of a currently-live chat run for this project, or None. Populated only when a run is genuinely in flight (DBOS ACTIVE) — the FE uses it to re-attach to the durable stream after a mid-run page refresh instead of showing static (pre-completion) history.
        last_turn_continuable:
          type: boolean
          title: Last Turn Continuable
          description: True when the most recent persisted turn failed terminally mid-way and left a continuable partial. The FE renders the Continue affordance on the last turn after a refresh, when the live partial_result terminal frame is no longer available.
          default: false
        selected_model:
          anyOf:
          - type: string
          - type: 'null'
          title: Selected Model
          description: The chat's persisted model-picker selection (a curated picker key), or None for the default chain. Seeds the composer dropdown.
      type: object
      required:
      - project_id
      - chat_history
      title: ChatHistorySchema
      description: Schema for a single chat with its full history.
    DocumentUrl:
      properties:
        url:
          type: string
          title: Url
        force_download:
          anyOf:
          - type: boolean
          - type: string
            const: allow-local
          title: Force Download
          default: false
        vendor_metadata:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Vendor Metadata
        kind:
          type: string
          const: document-url
          title: Kind
          default: document-url
        media_type:
          type: string
          title: Media Type
          description: Return the media type of the file, based on the URL or the provided `media_type`.
          readOnly: true
        identifier:
          type: string
          title: Identifier
          description: 'The identifier of the file, such as a unique ID.


            This identifier can be provided to the model in a message to allow it to refer to this file in a tool call argument,

            and the tool can look up the file in question by iterating over the message history and finding the matching `FileUrl`.


            This identifier is only automatically passed to the model when the `FileUrl` is returned by a tool.

            If you''re passing the `FileUrl` as a user message, it''s up to you to include a separate text part with the identifier,

            e.g. "This is file <identifier>:" preceding the `FileUrl`.


            It''s also included in inline-text delimiters for providers that require inlining text documents, so the model can

            distinguish multiple files.'
          readOnly: true
      type: object
      required:
      - url
      - media_type
      - identifier
      title: DocumentUrl
      description: The URL of the document.
    ModelRequest:
      properties:
        parts:
          items:
            oneOf:
            - $ref: '#/components/schemas/SystemPromptPart'
            - $ref: '#/components/schemas/UserPromptPart'
            - $ref: '#/components/schemas/ToolSearchReturnPart'
            - $ref: '#/components/schemas/LoadCapabilityReturnPart'
            - $ref: '#/components/schemas/ToolReturnPart'
            - $ref: '#/components/schemas/RetryPromptPart'
          type: array
          title: Parts
        timestamp:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Timestamp
        instructions:
          anyOf:
          - type: string
          - type: 'null'
          title: Instructions
        kind:
          type: string
          const: request
          title: Kind
          default: request
        run_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Run Id
        conversation_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Conversation Id
        metadata:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Metadata
      type: object
      required:
      - parts
      title: ModelRequest
      description: A request generated by Pydantic AI and sent to a model, e.g. a message from the Pydantic AI app to the model.
    AddressProjectResponse:
      properties:
        project_id:
          type: string
          format: uuid
          title: Project Id
        status:
          $ref: '#/components/schemas/ProjectStatus'
        county_fips:
          type: string
          title: County Fips
      type: object
      required:
      - project_id
      - status
      - county_fips
      title: AddressProjectResponse
      description: 'Response for the address create-flow.


        ``status`` is always ``pending`` at sync-response time; the async DBOS seed

    

# --- truncated at 32 KB (128 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/maia-analytics/refs/heads/main/openapi/maia-analytics-project-api-openapi.yml