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

# ManagerPerformanceAPI mirrors erdo_get_manager_performance.


> Daily spend, impressions, clicks, provider conversions, page visits, form starts, on-page lead events and captured leads for one organization or for every client organization this account manages, plus per-campaign spend where the source carries a campaign id. A measurement whose source could not be read is null with an entry in \`coverage\` saying which source and why, never zero.




## OpenAPI

````yaml /api/openapi.json get /v1/managed-organization-performance
openapi: 3.0.0
info:
  title: Erdo API
  description: >-
    Erdo's REST API: query and write datasets, run agents, manage threads,
    integrations, pages, evals, workstreams, experiments, and bounded outreach.
    Authenticate with a Bearer API key (erdo_api_...) or scoped token
    (erdo_token_...).
  version: '2026-09-15'
servers:
  - url: https://api.erdo.ai
    description: Production
security:
  - bearerAuth: []
paths:
  /v1/managed-organization-performance:
    get:
      summary: |
        ManagerPerformanceAPI mirrors erdo_get_manager_performance.
      description: >
        Daily spend, impressions, clicks, provider conversions, page visits,
        form starts, on-page lead events and captured leads for one organization
        or for every client organization this account manages, plus per-campaign
        spend where the source carries a campaign id. A measurement whose source
        could not be read is null with an entry in \`coverage\` saying which
        source and why, never zero.
      operationId: GET:mcp.ManagerPerformanceAPI
      parameters:
        - allowEmptyValue: true
          description: >
            OrganizationSlug names one organization. Omitting it reads every
            client organization the caller's account manages.
          explode: true
          in: query
          name: organization_slug
          required: false
          schema:
            type: string
          style: form
        - allowEmptyValue: true
          explode: true
          in: query
          name: from
          required: false
          schema:
            type: string
          style: form
        - allowEmptyValue: true
          explode: true
          in: query
          name: to
          required: false
          schema:
            type: string
          style: form
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  from:
                    type: string
                  message:
                    description: >
                      Asking for every client as an organization that manages
                      nobody is the case it exists for.
                    title: >
                      Message explains an empty list that would otherwise read
                      as a broken query.
                    type: string
                  organizations:
                    items:
                      $ref: '#/components/schemas/dataset.OrganizationPerformance'
                    type: array
                  timezone:
                    description: >
                      It is always "UTC" today, and is stated rather than
                      assumed so a consumer can tell if that ever changes.
                    title: >
                      Timezone names the calendar the daily rows are bucketed
                      on.
                    type: string
                  to:
                    type: string
                type: object
          description: Success response
        default:
          $ref: '#/components/responses/APIError'
components:
  schemas:
    dataset.OrganizationPerformance:
      properties:
        campaigns:
          description: |
            It is present only for sources that carry a campaign id.
          items:
            $ref: '#/components/schemas/dataset.CampaignPerformanceDay'
          title: >
            Campaigns is the same spend broken out by the provider's own
            campaign id,

            one row per day and campaign.
          type: array
        coverage:
          description: |
            A metric named here is null on every day rather than zero.
          items:
            $ref: '#/components/schemas/dataset.PerformanceCoverage'
          title: |
            Coverage names every measurement that could not be read, and why.
          type: array
        days:
          description: >
            Every day in the range is present, so a consumer can chart it
            without filling gaps of its own.
          items:
            $ref: '#/components/schemas/dataset.PerformanceDay'
          title: |
            Days carries one row per calendar day in the window, oldest first.
          type: array
        organization_name:
          type: string
        organization_slug:
          type: string
      title: |
        OrganizationPerformance is one client's window.
      type: object
    dataset.CampaignPerformanceDay:
      properties:
        account_id:
          type: string
        attribution:
          description: >
            "own\_account" means it came out of the organization's own
            advertising dataset; "shared\_account" means the manager's
            campaign-ownership catalog attributes a campaign running in a shared
            account to this organization.
          title: >
            Attribution says why this campaign's spend belongs to this
            organization.
          type: string
        campaign_id:
          type: string
        campaign_name:
          type: string
        clicks:
          format: int64
          type: integer
        conversions:
          type: number
        date:
          type: string
        evidence:
          description: >
            campaign belongs to this organization, carried through untouched.


            It is what lets a consumer treat one kind of claim differently from
            another — a campaign claimed because it points at this
            organization's page is evidence about today's funnel, and one
            claimed from a historical declaration may be spend whose traffic
            never reached this organization's pages at all. Erdo does not
            interpret the value; it reports it so a cost-per-lead can exclude
            what it should.
          title: >
            Evidence is the manager's own word for HOW it decided a
            shared-account
          type: string
        impressions:
          format: int64
          type: integer
        provider:
          type: string
        spend:
          type: number
      title: |
        CampaignPerformanceDay is one provider campaign's spend on one day.
      type: object
    dataset.PerformanceCoverage:
      properties:
        dataset:
          title: |
            Dataset names the dataset when one was found but could not be read.
          type: string
        metrics:
          items:
            type: string
          title: |
            Metrics names the fields that are null because of this gap.
          type: array
        purpose:
          title: |
            Purpose is the dataset role that would have answered.
          type: string
        reason:
          type: string
      title: >
        PerformanceCoverage is one measurement that is not in the answer, and
        why.
      type: object
    dataset.PerformanceDay:
      description: >
        Every measurement is a pointer: null means the source behind it could
        not be read, and \`coverage\` says which source and why.
      properties:
        clicks:
          format: int64
          type: integer
          nullable: true
        conversions:
          description: >
            It is not the same population as LeadsCaptured: the provider
            attributes its own conversions on its own window, and Erdo counts
            rows that reached a dataset.
          title: |
            Conversions is what the advertising provider counted.
          type: number
          nullable: true
        date:
          type: string
        form_starts:
          format: int64
          type: integer
          nullable: true
        impressions:
          format: int64
          type: integer
          nullable: true
        leads_captured:
          format: int64
          type: integer
          nullable: true
        leads_on_page:
          description: >
            They differ when a submission fails after the event fires, which is
            the gap worth watching, so both are reported rather than reconciled
            here.
          format: int64
          title: >
            LeadsOnPage is the page's own generate_lead event and LeadsCaptured
            is the row

            that reached the leads dataset.
          type: integer
          nullable: true
        spend:
          type: number
          nullable: true
        visits:
          format: int64
          type: integer
          nullable: true
      title: |
        PerformanceDay is one organization's numbers for one calendar day.
      type: object
  responses:
    APIError:
      content:
        application/json:
          schema:
            externalDocs:
              url: https://pkg.go.dev/encore.dev/beta/errs#Error
            properties:
              code:
                description: Error code
                example: not_found
                externalDocs:
                  url: https://pkg.go.dev/encore.dev/beta/errs#ErrCode
                type: string
              details:
                description: Error details
                type: object
              message:
                description: Error message
                type: string
            title: APIError
            type: object
      description: Error response
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).

````