> ## Documentation Index
> Fetch the complete documentation index at: https://docs.msportal.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload invoice

> Create or update one invoice with its PDF from your own billing system. It lists in the Invoices table with the synced ones, and the company's portal users can open the PDF there. Send the PDF inline as base64. The record is keyed by externalId: push it again to update it, for example when it is paid; omit pdf to keep the stored one. Requires `financial.write` and the linked user's write_settings_integrations permission; staff API keys only. No PSA or quoting integration is needed.



## OpenAPI

````yaml /openapi.json post /api/public/v1/financial/invoices
openapi: 3.0.3
info:
  title: MSPortal Public API
  version: 1.0.0
  description: >-
    Public API for MSPortal - provides programmatic access to tenant data.


    ## Authentication


    All endpoints require authentication via API key passed as a Bearer token:


    ```

    Authorization: Bearer <your-api-key>

    ```


    API keys can be created in the MSPortal dashboard under Settings →
    Integrations → API Access.


    **Important:** Do not include cookies in API requests. The public API uses
    stateless authentication only.


    ## Scopes


    API keys are granted specific scopes that determine what operations they can
    perform. Each endpoint documents its required scope(s).


    ## Rate Limiting


    API calls are rate limited per API key. Rate limit information is returned
    in response headers:


    - `X-RateLimit-Limit`: Maximum requests per minute

    - `X-RateLimit-Remaining`: Remaining requests in current window

    - `X-RateLimit-Reset`: When the rate limit resets (ISO 8601)


    ## Request ID


    All responses include an `X-Request-Id` header for debugging and support.
    You can also pass your own `X-Request-Id` header to correlate requests.
  contact:
    name: MSPortal Support
    email: support@msportal.ai
  license:
    name: Proprietary
servers:
  - url: https://app.msportal.ai
    description: Production (US)
  - url: https://eu.msportal.ai
    description: Production (EU)
security:
  - BearerAuth: []
tags:
  - name: Budgets
    description: >-
      Budget management - create, track, and forecast budgets with line items,
      categories, and products
  - name: Calendar
    description: Calendar and meeting management - events, participants, and meeting types
  - name: Companies
    description: Company management endpoints
  - name: Company Users
    description: Company user management - client portal contacts (read-only, paginated)
  - name: Compliance
    description: Compliance check management - runs, assigned checks, and status updates
  - name: Dashboards
    description: Dashboard management - external iframe resources and internal dashboards
  - name: Devices
    description: Device management - inventory, types, and locations
  - name: Goals
    description: Goal management - create, track, and manage goals with tasks and updates
  - name: NPS Surveys
    description: >-
      NPS survey management - Net Promoter Score surveys, responses, and
      analytics
  - name: Reports
    description: >-
      Report management - create, manage, and schedule reports with templates
      and types
  - name: Planner
    description: >-
      Planner item management - tasks, roadmap items, and project planning with
      linked goals, compliance, and projects
  - name: Surveys
    description: >-
      General survey management - multi-question surveys, responses, and
      statistics
  - name: Tickets
    description: Ticket management - view and filter tickets from PSA integrations
  - name: Training
    description: >-
      Training management - courses, enrollments, certificates, and progress
      tracking
  - name: Users
    description: Tenant user management - internal staff and team members (read-only)
  - name: Automation Rules
    description: >-
      Automation rule management - create, configure, and monitor automation
      rules with triggers, conditions, and actions
  - name: Analytics
    description: >-
      Analytics and reporting - company audit data, training analytics, user
      activity, and portfolio metrics
  - name: Client Onboarding
    description: >-
      Client onboarding - portals (phases, tasks, contacts, activation),
      templates, checklist templates, forms and documentation pages
  - name: Backup
    description: >-
      Backup - summaries, protected devices, alerts and SaaS protection (Datto,
      Axcient, Slide, Kaseya)
  - name: Microsoft 365
    description: Microsoft 365 - licenses, users, domains and Secure Score
  - name: Security
    description: >-
      Security - posture summary, EDR incidents, vulnerabilities, email threats,
      firewalls, DNS filtering and security awareness
  - name: Financial
    description: Financial - quotes, invoices and revenue summaries
  - name: Integrations
    description: Integrations - status, sync health, pause and resume (never credentials)
  - name: Documentation
    description: >-
      Documentation - pages, folders and articles synced from Hudu or IT Glue,
      plus built-in pages
  - name: Broadcasts
    description: Broadcasts - emergency broadcasts, recipients and groups
  - name: Notifications
    description: Notifications - the linked user's in-app notifications
  - name: Standards
    description: >-
      Standards - technology standards catalog, service plans, applicability,
      deployment statuses, compliance rollups, white space and costs
  - name: Customer Success
    description: >-
      Customer success - client health scores, trends, benchmarks and Traffic
      Light Reviews
  - name: Tasks
    description: Tasks - the linked user's personal task list
  - name: Tenant Setup
    description: Tenant setup - profile, branding and portal settings (never secrets)
  - name: Roles
    description: Roles - staff and client roles and their permission grants
  - name: Ticket Templates
    description: Ticket templates - reusable ticket definitions
  - name: Readiness
    description: Client readiness - account readiness assessments
  - name: Projects
    description: >-
      Projects - PSA projects with health overlays (deliverables, milestones,
      client actions, weekly updates), phases, tickets, time entries, PSA
      status/owner/priority write-through, ticket notes, task controls, display
      settings and the document library
paths:
  /api/public/v1/financial/invoices:
    post:
      tags:
        - Financial
      summary: Upload invoice
      description: >-
        Create or update one invoice with its PDF from your own billing system.
        It lists in the Invoices table with the synced ones, and the company's
        portal users can open the PDF there. Send the PDF inline as base64. The
        record is keyed by externalId: push it again to update it, for example
        when it is paid; omit pdf to keep the stored one. Requires
        `financial.write` and the linked user's write_settings_integrations
        permission; staff API keys only. No PSA or quoting integration is
        needed.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadInvoiceRequest'
      responses:
        '200':
          description: invoice updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        format: uuid
                        description: MSPortal id; use it to delete the record
                      externalId:
                        type: string
                      created:
                        type: boolean
                        description: true when created, false when updated
                    required:
                      - id
                      - externalId
                      - created
                required:
                  - data
        '201':
          description: invoice created
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        format: uuid
                        description: MSPortal id; use it to delete the record
                      externalId:
                        type: string
                      created:
                        type: boolean
                        description: true when created, false when updated
                    required:
                      - id
                      - externalId
                      - created
                required:
                  - data
        '400':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            Forbidden - missing scope (financial.write), a company-user key, or
            the linked user lacks write_settings_integrations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Company not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '413':
          description: The PDF is larger than 3,000,000 bytes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BearerAuth: []
components:
  schemas:
    UploadInvoiceRequest:
      type: object
      properties:
        externalId:
          type: string
          minLength: 1
          maxLength: 255
          description: >-
            Your system's id for the record. Pushing the same externalId again
            updates the record instead of creating a second one.
        invoiceNumber:
          type: string
          minLength: 1
          maxLength: 100
          description: Invoice number; at most 18 digits in total
          example: 2026-1042
        companyId:
          type: string
          format: uuid
          description: >-
            MSPortal company (client) id, from GET /api/public/v1/companies. Its
            portal users see the record.
        invoiceDate:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
          example: '2026-10-01'
        dueDate:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        paidDate:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
          description: Set when paid; marks the invoice closed
        status:
          type: string
          maxLength: 100
          description: Status shown in the table
          example: Open
        invoiceType:
          type: string
          maxLength: 100
          description: Defaults to Standard
        currency:
          type: string
          pattern: ^[A-Za-z]{3}$
          description: ISO 4217 currency code
          example: EUR
        total:
          type: number
          minimum: 0
          exclusiveMinimum: true
          maximum: 1000000000000
          description: Invoice total; must be greater than 0
          example: 1190
        subtotal:
          type: number
          minimum: -1000000000000
          maximum: 1000000000000
        salesTax:
          type: number
          minimum: -1000000000000
          maximum: 1000000000000
        payments:
          type: number
          minimum: -1000000000000
          maximum: 1000000000000
        balance:
          type: number
          minimum: -1000000000000
          maximum: 1000000000000
          description: >-
            Amount still due; defaults to 0 when paidDate is set, otherwise
            total minus payments
        reference:
          type: string
          maxLength: 255
        customerPo:
          type: string
          maxLength: 100
        pdf:
          $ref: '#/components/schemas/FinancialUploadPdf'
      required:
        - externalId
        - invoiceNumber
        - companyId
        - invoiceDate
        - total
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Error message
        requestId:
          type: string
          description: Request correlation ID
        details:
          nullable: true
          description: Additional error details
        code:
          type: string
          description: Error code
      required:
        - error
    FinancialUploadPdf:
      type: object
      properties:
        fileName:
          type: string
          minLength: 1
          maxLength: 255
          pattern: \.pdf$/i
          description: File name ending in .pdf
          example: invoice-2026-1042.pdf
        contentBase64:
          type: string
          description: >-
            The PDF's bytes as standard base64 (no data: prefix), at most
            3,000,000 bytes decoded
      required:
        - fileName
        - contentBase64
      description: >-
        The document the client opens in the portal. Required the first time an
        externalId is pushed; omit it on a later push to keep the stored PDF.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Use your API key as a Bearer token. API keys can be generated in
        Settings → Integrations → API Access.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.