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

> ## Agent Instructions
> This site documents Locus for people. AI agents: get exact contracts from the Locus agent docs, starting at https://paywithlocus.com/agent/index.md, including when asked to implement or integrate docs.paywithlocus.com.
> Connect this agent to Locus Pro: https://paywithlocus.com/skill.md. Implement Locus Pro in a product: https://paywithlocus.com/agent/integrate.md. Agent site index: https://paywithlocus.com/llms.txt.

# Every customer with spend in a window

> Each (attribution.source, customerId) pair the tenant's charges were attributed to in the window, counted exactly as analytics counts customer spend, named from the customer directory, filterable by product, searchable, and paged past the analytics row cap. sources totals every product with customer spend in the window and ignores source and q. Enterprise workspaces only.



## OpenAPI

````yaml /api-reference/openapi.json get /credits/analytics/customers
openapi: 3.1.0
info:
  title: Locus Pro API
  description: >-
    Access paid tools, manage prepaid balances, and build usage billing. Send
    money as exact decimal strings and reuse Idempotency-Key on retries.
    Management routes require a scoped server key or authorized dashboard
    session. Sensitive workspace changes require an owner or admin with recent
    MFA or passkey verification, except where an operation documents a stricter
    boundary. Interactive agents use MCP OAuth; unattended agents use scoped
    Agent Connections. Browser widgets use end-user tokens.
  version: 0.7.0
servers:
  - url: https://api.paywithlocus.com/api
    description: Production
  - url: https://api.stage.paywithlocus.com/api
    description: Stage — evaluation and integration testing
security:
  - secretKey: []
tags:
  - name: Authentication
    description: Email-verified self-serve account creation and dashboard identity
  - name: Tenants
    description: Tenant profile, keys, and settings (dashboard session or secret key)
  - name: Workspace members
    description: Invite-only human workspace membership and role administration
  - name: Catalog
    description: Enable/disable APIs and set markups
  - name: Custom APIs
    description: Feature-gated enterprise BYOK providers and schema-backed custom actions
  - name: End users
    description: End-user accounts, tokens, and allocations
  - name: Customers
    description: >-
      Names for the customers a tenant attributes spend to, and every customer's
      spend
  - name: Top-ups
    description: Locus-hosted checkout top-ups and quotes
  - name: Ledger
    description: Burn/top-up history and earnings
  - name: Webhooks
    description: Signed events, delivery inspection, and replay
  - name: Burn
    description: Metered pay-per-use calls
  - name: MCP
    description: Stateless Streamable HTTP transport and MCP tool-result contracts
  - name: Okibi Identity
    description: >-
      Feature-gated Okibi identity verification and scoped native CLI credential
      bootstrap
  - name: Widget
    description: End-user JWT surface; a matching publishable key is optional
  - name: Agent-native onboarding
    description: >-
      Self-registration, human Stripe funding handoff, and restricted account
      setup for headless agents
  - name: Hosted Workflows
    description: >-
      Tenant-private TypeScript Workflow definitions, immutable versions,
      bounded runs, artifacts, and recovery
  - name: Resources
    description: >-
      Durable resources an agent bought, such as phone numbers, inboxes and
      sandboxes
  - name: Tasks
    description: >-
      Delegate a multi-step outcome to Locus with one goal string. Locus
      compiles an acceptance contract, discovers and calls enabled catalog
      capabilities with the caller's own credits and spending controls, checks
      every returned value against stored provider evidence, and returns
      structured results, files, requirement statuses, and settled cost. Enabled
      when the deployment sets LOCUS_TASKS_ENABLED.
  - name: Agent connections
    description: Scoped, expiring, revocable credentials for agent execution
  - name: Recipes
    description: >-
      Search, research, extraction, enrichment, and travel outcomes across
      providers
paths:
  /credits/analytics/customers:
    get:
      tags:
        - Customers
      summary: Every customer with spend in a window
      description: >-
        Each (attribution.source, customerId) pair the tenant's charges were
        attributed to in the window, counted exactly as analytics counts
        customer spend, named from the customer directory, filterable by
        product, searchable, and paged past the analytics row cap. sources
        totals every product with customer spend in the window and ignores
        source and q. Enterprise workspaces only.
      operationId: getCreditsAnalyticsCustomers
      parameters:
        - name: days
          in: query
          schema:
            type: integer
            enum:
              - 7
              - 30
              - 90
            default: 30
          description: Legacy form, as analytics. Cannot be combined with from/to.
        - name: from
          in: query
          schema:
            type: string
            format: date-time
          description: Window start, inclusive. Strict ISO-8601. Requires to.
        - name: to
          in: query
          schema:
            type: string
            format: date-time
          description: Window end, EXCLUSIVE. Strict ISO-8601. Requires from.
        - name: source
          in: query
          schema:
            type: string
            maxLength: 128
          description: >-
            Only this product's customers (attribution.source), exactly as
            tagged. Send it empty (source=) for customers with no product tag;
            omit it for every product.
        - name: q
          in: query
          schema:
            type: string
            maxLength: 120
          description: >-
            Case-insensitive literal substring of the directory name, the link,
            or the customer id.
        - name: offset
          in: query
          schema:
            type: integer
            minimum: 0
            maximum: 2147483647
            default: 0
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
      responses:
        '200':
          description: One page of customers, the matching total, and per-product totals
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                  - success
                  - periodStart
                  - periodEndExclusive
                  - total
                  - customers
                  - sources
                properties:
                  success:
                    type: boolean
                    const: true
                  periodStart:
                    type: string
                    format: date-time
                  periodEndExclusive:
                    type: string
                    format: date-time
                  total:
                    type: integer
                    description: Customers matching source and q, across all pages.
                  customers:
                    type: array
                    items:
                      $ref: '#/components/schemas/CustomerSpend'
                  sources:
                    type: array
                    items:
                      $ref: '#/components/schemas/AnalyticsCustomerSource'
        '400':
          description: Invalid window, page, source, or search
        '401':
          $ref: '#/components/responses/UnauthorizedManagement'
        '403':
          $ref: '#/components/responses/InsufficientScope'
        '503':
          description: Too many analytics reads in flight; retry after Retry-After seconds
      security:
        - dashboardSession: []
        - secretKey: []
components:
  schemas:
    CustomerSpend:
      type: object
      additionalProperties: false
      required:
        - spenderId
        - source
        - customerId
        - name
        - url
        - adminUrl
        - usageUsdc
        - calls
        - providers
        - firstChargeAt
        - lastChargeAt
      properties:
        spenderId:
          type: string
          description: >-
            <URL-encoded source>/<customerId>; focuses analytics as
            initiator=customer:<spenderId>.
        source:
          type: string
        customerId:
          type: string
        name:
          type:
            - string
            - 'null'
        url:
          type:
            - string
            - 'null'
        adminUrl:
          type:
            - string
            - 'null'
        usageUsdc:
          type: string
        calls:
          type: integer
        providers:
          type: integer
        firstChargeAt:
          type: string
          format: date-time
        lastChargeAt:
          type: string
          format: date-time
    AnalyticsCustomerSource:
      type: object
      additionalProperties: false
      required:
        - source
        - customers
        - usageUsdc
        - calls
      properties:
        source:
          type: string
        customers:
          type: integer
        usageUsdc:
          type: string
        calls:
          type: integer
    InsufficientScopeError:
      type: object
      additionalProperties: false
      required:
        - success
        - error
        - code
        - message
        - requiredScopes
        - presentScopes
      properties:
        success:
          const: false
        error:
          const: Forbidden
        code:
          const: INSUFFICIENT_SCOPE
        message:
          type: string
        requiredScopes:
          type: array
          items:
            $ref: '#/components/schemas/CreditsTenantScope'
          minItems: 1
          uniqueItems: true
        presentScopes:
          type: array
          items:
            $ref: '#/components/schemas/CreditsTenantScope'
          uniqueItems: true
    CreditsTenantScope:
      type: string
      enum:
        - tenant:read
        - tenant:write
        - catalog:write
        - credits:move
        - credentials:manage
        - tokens:manage
        - payouts:manage
        - members:manage
        - widget:read
  responses:
    UnauthorizedManagement:
      description: Missing, invalid, expired, or revoked management credential
    InsufficientScope:
      description: >-
        The authenticated management credential lacks one or more required
        scopes
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/InsufficientScopeError'
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      description: Tenant secret key (lcr_…). Server-side only.
    dashboardSession:
      type: http
      scheme: bearer
      description: >-
        Locus Pro dashboard session (Cognito). High-risk workspace
        administration requires an owner or admin role and fresh MFA/passkey
        step-up.

````

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