# Read editions and chapters

Read public weekly editions and chapters, or your private review history, through the same web, API, MCP and CLI services.

## Public history

Use editions.list or chapters.list with project_id. Public reads require a visible project and return published editions or visible chapters. Public DTOs omit raw edition log IDs, private chapter evidence and unsupported metadata. editions.get accepts project_id, iso_year and iso_week and returns the edition, its public updates and previous/next published weeks.

## Complete pagination

List operations accept limit from 1 to 100 and an opaque cursor. Continue with nextCursor until it is null. A cursor belongs to its project, visibility and feed filters; do not change those filters between pages. editions.feed pages public editions across projects, with optional project_id and range. tab following requires authentication and updates:read; project tokens remain restricted to that project.

## Private review

editions.mine and chapters.mine require projects:read and ownership of the requested project. They include draft editions or hidden chapter evidence for review. No new permission scope is added. Existing chapter rename/hide controls still use chapters.update.

## API and tools

The generic invoke_operation MCP tool and CLI call command use these same validated contracts. Dedicated MCP tools whose canonical input is a union use an input object wrapper so discovery preserves conditional requirements; for example op_voice_import nests its source and URL fields inside input. Generic invoke_operation and REST/CLI retain their canonical input shape. Generated operation references below include the exact input schemas and access rules.

```text
GET /api/v2/editions?project_id=7&limit=50
GET /api/v2/editions/detail?project_id=7&iso_year=2026&iso_week=2
GET /api/v2/chapters?project_id=7
indielogs call editions.list '{"project_id":7,"limit":50}'
```

---

# Get started

Connect a project, choose the evidence IndieLogs may read, and review the first update before anything goes public.

## What IndieLogs does

IndieLogs turns selected project activity into draft updates for a public maker and project journal. GitHub commits, deploy events, repository notes and coding-agent context can provide evidence. Drafts can be checked against their sources, edited, held or published.

A connected source does not mean that its output is automatically public. Publication policy and enabled output channels control what happens after a draft is created.

## Set up a project

- Create or select a project in Settings → Projects.
- Install the IndieLogs GitHub App and grant access only to repositories you choose.
- Link a repository to a project. Configure the branch and excluded paths before rebuilding history.
- Review the discovered commits and reconstructed editions. Publish the history only after reviewing it.
- Choose an Autopilot policy. The default review policy leaves each draft waiting for you.

## Before connecting providers

GitHub App, OAuth, AI Gateway, email, billing and social-output integrations depend on deployment configuration as well as your account settings. A setup control in the app does not confirm that the provider credentials, provider account permissions or production delivery are ready.

---

# Autopilot and the press desk

How source events become reviewable drafts, what the publication policies mean, and when a draft stays held.

## Evidence in, draft out

The pipeline reads eligible source events for a project, classifies work, prepares a concise draft and checks factual claims and privacy rules. It stores source references and provenance for review. It does not store repository source code as draft evidence.

A coding agent can create a source-backed draft through the shared operation registry. That request creates a draft; it does not schedule or publish it.

## Publication policies

- Review: drafts wait for an explicit publish action.
- Veto: eligible drafts may be scheduled after the configured veto period. A held draft still waits for review.
- Auto: eligible drafts may be scheduled without a veto delay. A held draft still waits for review.
- The project daily limit is one automatic publication. Quiet periods, skip rules, source exclusions and safety checks can leave work unpublished.

## Review gates

A draft can be held when evidence is insufficient, a number cannot be verified, a customer or teammate is mentioned, private information is detected, repository access changes, or an edit needs a fresh check. Review the linked evidence and resolve the reason before releasing or publishing.

The public update is written only after the publication operation succeeds. X and LinkedIn are separate optional output channels and require their own provider connection and deployment support.

---

# Sources and project settings

Configure repository, deploy, note, screenshot and revenue sources for each project.

## Repository and notes

- The GitHub App installation provides access to repositories explicitly granted to that installation.
- Link one repository to a project, select the branch, and maintain excluded paths for material that must not be read.
- Repository note globs select supported notes such as docs/daily-log/*.md. Exclude private files and paths before enabling a source.
- Commit history rebuild creates reconstructed history. Review the generated editions and chapters before publishing them.

## Deploys and screenshots

Deploy webhooks can attach deployment evidence to a project. Screenshot capture and configured screenshot URLs depend on the site origin, safe public URL checks, storage and outbound configuration. They do not guarantee that a provider page can be captured.

Public screenshots attached to a draft may appear in the resulting update. Check the destination, caption and visibility before publication.

## Revenue data

Revenue connection is a separate read-only integration. The app accepts provider credentials through its connection flow and can show verified revenue according to the project display setting. The documentation does not promise that any particular Stripe account, key, subscription or live provider connection has been accepted.

Disconnecting a revenue source stops future reads; it does not change the provider account.

---

# GitHub App and repository access

Install IndieLogs, grant repository access, link a project and control the history rebuild.

## Prerequisites

- You need an IndieLogs account and permission to install GitHub Apps in the GitHub account or organization.
- The IndieLogs deployment must have its GitHub App identity, signing key, callback origin and encryption configuration set by its operator.
- The GitHub App must be installed with access to the repository you want to connect. Organization approval may be required.

## Connect a repository

- Start the GitHub App installation from project settings.
- Choose an available repository and link it to the project.
- Confirm the branch and excluded paths. A repository name or path can itself be sensitive; public drafts should not reveal private names.
- Request a history rebuild, then inspect the reconstructed editions before publishing.

## Access and storage

The application stores encrypted provider credentials and source-event metadata required by the pipeline. It does not ingest Git blobs or save repository code. Removing a repository link or revoking the GitHub App prevents further access but does not erase previously published updates.

---

# MCP server

Connect an agent to the IndieLogs Streamable HTTP MCP server and use the same operation contract as the API.

## Endpoint and authentication

The MCP endpoint is /mcp on the configured public site origin. The server uses Streamable HTTP POST. It requires an authenticated identity, a scoped API token and an Autopilot entitlement. GET returns 405.

OAuth discovery and token verification depend on an externally operated issuer configured as MCP_ISSUER_URL; IndieLogs does not run that authorization server. The issuer must publish matching HTTPS authorization, token, dynamic-registration and JWKS endpoints with PKCE S256. Issued JWTs must use RS256, target the exact MCP_RESOURCE_URL audience and provide a verified IndieLogs account mapping in indielogs_user_id, plus the requested scopes. MCP_RESOURCE_URL is required when validating tokens even though protected-resource discovery has a fallback URL. These prerequisites and a working OAuth client must be configured and accepted separately. A scoped IndieLogs API token is the other supported credential path.

## Tools

Named tools and generic operation tools are derived from the shared contract allowlist. The table below is rendered from the registered MCP definitions; session-only operations are not exposed. The invoke_operation tool accepts only an operation included in that allowlist.

## Safety

- draft_update creates a source-backed draft and never publishes it.
- publish_draft is an explicit write and still respects ownership, token scope and draft review gates.
- Do not give an agent a database service key. Use a revocable IndieLogs token with only the scopes it needs.
- MCP is rate limited per token. Provider delivery and production OAuth acceptance require separate verification.

## Registered MCP tools

### op_revenue_disclosures

Execute IndieLogs revenue.disclosures operation.

Operation: `revenue.disclosures`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_ids": {
      "minItems": 1,
      "maxItems": 80,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    }
  },
  "required": [
    "project_ids"
  ]
}
```

### op_reports_generate

Execute IndieLogs reports.generate operation.

Operation: `reports.generate`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "idea",
        "bmc",
        "marketing"
      ]
    },
    "targetMarket": {
      "type": "string",
      "minLength": 2,
      "maxLength": 500
    },
    "ideaDescription": {
      "type": "string",
      "minLength": 8,
      "maxLength": 2000
    },
    "businessIdea": {
      "type": "string",
      "minLength": 8,
      "maxLength": 2000
    },
    "foundingTeam": {
      "type": "string",
      "maxLength": 2000
    },
    "budget": {
      "type": "string",
      "maxLength": 2000
    },
    "monthlyMarketingBudget": {
      "type": "string",
      "maxLength": 2000
    },
    "currentUserBase": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "kind",
    "targetMarket"
  ]
}
```

### op_reports_read

Execute IndieLogs reports.read operation.

Operation: `reports.read`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "idea",
        "bmc",
        "marketing"
      ]
    },
    "id": {
      "type": "string",
      "pattern": "^(?:[1-9]\\d{0,17}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$"
    },
    "report_access_token": {
      "type": "string",
      "minLength": 1,
      "maxLength": 512
    }
  },
  "required": [
    "kind",
    "id",
    "report_access_token"
  ]
}
```

### op_sponsorships_options

Execute IndieLogs sponsorships.options operation.

Operation: `sponsorships.options`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_sponsorships_mine

Execute IndieLogs sponsorships.mine operation.

Operation: `sponsorships.mine`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 500
    }
  }
}
```

### op_sponsorships_active

Execute IndieLogs sponsorships.active operation.

Operation: `sponsorships.active`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_search_public

Execute IndieLogs search.public operation.

Operation: `search.public`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "q": {
      "type": "string"
    },
    "kind": {
      "default": "all",
      "type": "string",
      "enum": [
        "all",
        "maker",
        "project",
        "update"
      ]
    },
    "limit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    },
    "cursor": {
      "type": "string",
      "maxLength": 1600
    }
  },
  "required": [
    "q"
  ]
}
```

### op_outputs_list

Execute IndieLogs outputs.list operation.

Operation: `outputs.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "log_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "log_id"
  ]
}
```

### op_outputs_retry

Execute IndieLogs outputs.retry operation.

Operation: `outputs.retry`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "log_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "channel": {
      "type": "string",
      "enum": [
        "x",
        "linkedin",
        "webhook"
      ]
    }
  },
  "required": [
    "log_id",
    "channel"
  ]
}
```

### op_billing_read

Execute IndieLogs billing.read operation.

Operation: `billing.read`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_editions_list

Execute IndieLogs editions.list operation.

Operation: `editions.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_editions_get

Execute IndieLogs editions.get operation.

Operation: `editions.get`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "iso_year": {
      "type": "integer",
      "minimum": 1900,
      "maximum": 9999
    },
    "iso_week": {
      "type": "integer",
      "minimum": 1,
      "maximum": 53
    }
  },
  "required": [
    "project_id",
    "iso_year",
    "iso_week"
  ]
}
```

### op_editions_feed

Execute IndieLogs editions.feed operation.

Operation: `editions.feed`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    },
    "tab": {
      "default": "everyone",
      "type": "string",
      "enum": [
        "everyone",
        "following"
      ]
    },
    "range": {
      "default": "all",
      "type": "string",
      "enum": [
        "all",
        "week",
        "month",
        "year"
      ]
    }
  }
}
```

### op_editions_mine

Execute IndieLogs editions.mine operation.

Operation: `editions.mine`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_chapters_list

Execute IndieLogs chapters.list operation.

Operation: `chapters.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_chapters_mine

Execute IndieLogs chapters.mine operation.

Operation: `chapters.mine`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_feed_list

Execute IndieLogs feed.list operation.

Operation: `feed.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    },
    "sort": {
      "type": "string",
      "enum": [
        "recent",
        "trending"
      ]
    },
    "range": {
      "type": "string",
      "enum": [
        "all",
        "week",
        "month",
        "year"
      ]
    },
    "tab": {
      "type": "string",
      "enum": [
        "everyone",
        "following"
      ]
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}
```

### op_profiles_get

Execute IndieLogs profiles.get operation.

Operation: `profiles.get`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    }
  },
  "required": [
    "username"
  ]
}
```

### op_rankings_list

Execute IndieLogs rankings.list operation.

Operation: `rankings.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "board": {
      "type": "string",
      "enum": [
        "makers",
        "projects"
      ]
    },
    "period": {
      "type": "string",
      "enum": [
        "today",
        "week",
        "month",
        "all"
      ]
    },
    "metric": {
      "type": "string",
      "enum": [
        "updates",
        "streak",
        "mrr",
        "revenue"
      ]
    },
    "category": {
      "type": "string",
      "maxLength": 80
    },
    "type": {
      "type": "string",
      "enum": [
        "founder",
        "startup"
      ]
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}
```

### op_projects_directory

Execute IndieLogs projects.directory operation.

Operation: `projects.directory`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "maxLength": 80
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}
```

### list_projects

List your projects.

Operation: `projects.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_projects_get

Execute IndieLogs projects.get operation.

Operation: `projects.get`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_projects_create

Execute IndieLogs projects.create operation.

Operation: `projects.create`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "status": {
      "type": "string",
      "maxLength": 60
    },
    "url": {
      "type": "string",
      "maxLength": 2048
    },
    "logo": {
      "type": "string",
      "maxLength": 2048
    },
    "category": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "slug": {
      "type": "string",
      "maxLength": 120
    }
  },
  "required": [
    "name"
  ]
}
```

### op_projects_update

Execute IndieLogs projects.update operation.

Operation: `projects.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "status": {
      "type": "string",
      "maxLength": 60
    },
    "url": {
      "type": "string",
      "maxLength": 2048
    },
    "logo": {
      "type": "string",
      "maxLength": 2048
    },
    "category": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "slug": {
      "type": "string",
      "maxLength": 120
    }
  },
  "required": [
    "id"
  ]
}
```

### op_projects_delete

Execute IndieLogs projects.delete operation.

Operation: `projects.delete`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_projects_analyze

Execute IndieLogs projects.analyze operation.

Operation: `projects.analyze`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    }
  },
  "required": [
    "url"
  ]
}
```

### recent_updates

Read recent published updates for one project.

Operation: `updates.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    }
  },
  "required": [
    "project"
  ]
}
```

### op_updates_publish

Execute IndieLogs updates.publish operation.

Operation: `updates.publish`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "string",
          "pattern": "^[1-9]\\d*$"
        }
      ]
    },
    "description": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "date": {
      "type": "string"
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "video": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "items": {
      "maxItems": 16,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 280
      }
    },
    "idempotencyKey": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,200}$"
    }
  },
  "required": [
    "project_id",
    "description"
  ]
}
```

### op_updates_update

Execute IndieLogs updates.update operation.

Operation: `updates.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "date": {
      "type": [
        "string",
        "null"
      ]
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "video": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "items": {
      "maxItems": 16,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 280
      }
    }
  },
  "required": [
    "id"
  ]
}
```

### op_updates_delete

Execute IndieLogs updates.delete operation.

Operation: `updates.delete`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_updates_cheer

Execute IndieLogs updates.cheer operation.

Operation: `updates.cheer`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_updates_replies_list

Execute IndieLogs updates.replies.list operation.

Operation: `updates.replies.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_updates_replies_create

Execute IndieLogs updates.replies.create operation.

Operation: `updates.replies.create`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "body_html": {
      "type": "string",
      "maxLength": 2000
    },
    "description": {
      "type": "string",
      "maxLength": 2000
    },
    "text": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "id"
  ]
}
```

### op_updates_replies_delete

Execute IndieLogs updates.replies.delete operation.

Operation: `updates.replies.delete`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "reply_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### get_desk

Read one page of waiting, queued, or held drafts; use offset to retrieve another page.

Operation: `drafts.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740892
    }
  }
}
```

### draft_update

Create a source-backed draft for review. It never publishes.

Operation: `drafts.from_evidence`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 100,
          "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
        }
      ]
    },
    "summary": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "why": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "commits": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "numbers": {
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            ]
          },
          "source": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000
          }
        },
        "required": [
          "value",
          "source"
        ],
        "additionalProperties": false
      }
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "project",
    "summary"
  ]
}
```

### op_drafts_get

Execute IndieLogs drafts.get operation.

Operation: `drafts.get`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_drafts_create

Execute IndieLogs drafts.create operation.

Operation: `drafts.create`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "summary": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "title": {
      "type": "string",
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "why": {
      "type": "string",
      "maxLength": 2000
    },
    "commits": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "scheduled_for": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "publication_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "visual": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "card",
            "screenshot",
            "none"
          ]
        },
        "card": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 100
            },
            {
              "type": "object",
              "properties": {
                "k": {
                  "type": "string",
                  "maxLength": 100
                },
                "big": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 100
                    },
                    {
                      "type": "number"
                    }
                  ]
                },
                "sub": {
                  "type": "string",
                  "maxLength": 300
                }
              },
              "required": [
                "k",
                "big",
                "sub"
              ]
            }
          ]
        },
        "url": {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        },
        "caption": {
          "type": "string",
          "maxLength": 500
        }
      },
      "required": [
        "kind"
      ]
    },
    "variants": {
      "type": "object",
      "properties": {
        "x": {
          "type": "string",
          "maxLength": 3000
        },
        "linkedin": {
          "type": "string",
          "maxLength": 3000
        },
        "outputs": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "boolean"
          }
        }
      }
    },
    "idempotencyKey": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,200}$"
    }
  },
  "required": [
    "project_id",
    "summary"
  ]
}
```

### op_drafts_generate

Execute IndieLogs drafts.generate operation.

Operation: `drafts.generate`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "source_ids": {
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "project_id",
    "source_ids"
  ]
}
```

### op_drafts_update

Execute IndieLogs drafts.update operation.

Operation: `drafts.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "title": {
      "type": "string",
      "maxLength": 200
    },
    "scheduled_for": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "publication_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "visual": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "card",
            "screenshot",
            "none"
          ]
        },
        "card": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 100
            },
            {
              "type": "object",
              "properties": {
                "k": {
                  "type": "string",
                  "maxLength": 100
                },
                "big": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 100
                    },
                    {
                      "type": "number"
                    }
                  ]
                },
                "sub": {
                  "type": "string",
                  "maxLength": 300
                }
              },
              "required": [
                "k",
                "big",
                "sub"
              ]
            }
          ]
        },
        "url": {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        },
        "caption": {
          "type": "string",
          "maxLength": 500
        }
      },
      "required": [
        "kind"
      ]
    },
    "variants": {
      "type": "object",
      "properties": {
        "x": {
          "type": "string",
          "maxLength": 3000
        },
        "linkedin": {
          "type": "string",
          "maxLength": 3000
        },
        "outputs": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "boolean"
          }
        }
      }
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "id"
  ]
}
```

### op_drafts_schedule

Execute IndieLogs drafts.schedule operation.

Operation: `drafts.schedule`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "scheduled_for": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "id",
    "scheduled_for",
    "expected_updated_at"
  ]
}
```

### publish_draft

Publish a ready draft, respecting holds.

Operation: `drafts.publish`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "draft_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "confirm_unverified": {
      "type": "boolean"
    },
    "acknowledgement": {
      "type": "string"
    }
  },
  "required": [
    "draft_id"
  ]
}
```

### op_drafts_hold

Execute IndieLogs drafts.hold operation.

Operation: `drafts.hold`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_drafts_hold_all

Execute IndieLogs drafts.hold-all operation.

Operation: `drafts.hold-all`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_drafts_skip

Execute IndieLogs drafts.skip operation.

Operation: `drafts.skip`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_drafts_rewrite

Execute IndieLogs drafts.rewrite operation.

Operation: `drafts.rewrite`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "instruction": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "id"
  ]
}
```

### op_drafts_release

Execute IndieLogs drafts.release operation.

Operation: `drafts.release`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "id"
  ]
}
```

### attach_screenshot

Attach a public image or base64 screenshot to a draft.

Operation: `drafts.attach_screenshot`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "draft_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "image_base64": {
      "type": "string",
      "maxLength": 14000000
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "caption": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "draft_id"
  ]
}
```

### op_story_publish

Execute IndieLogs story.publish operation.

Operation: `story.publish`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_story_split

Execute IndieLogs story.split operation.

Operation: `story.split`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_story_rebuild

Execute IndieLogs story.rebuild operation.

Operation: `story.rebuild`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "lookback_days": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 36500
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_story_rebuild_status

Execute IndieLogs story.rebuild-status operation.

Operation: `story.rebuild-status`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_story_decline

Execute IndieLogs story.decline operation.

Operation: `story.decline`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "edition_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "reason": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_story_undo

Execute IndieLogs story.undo operation.

Operation: `story.undo`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "edition_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_chapters_update

Execute IndieLogs chapters.update operation.

Operation: `chapters.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "title": {
      "type": "string",
      "maxLength": 120
    },
    "hidden": {
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ]
}
```

### op_voice_read

Execute IndieLogs voice.read operation.

Operation: `voice.read`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_voice_update

Execute IndieLogs voice.update operation.

Operation: `voice.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "traits": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number",
        "minimum": 0,
        "maximum": 100
      }
    },
    "rules": {
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 300
      }
    },
    "banned_phrases": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    }
  }
}
```

### op_voice_try

Execute IndieLogs voice.try operation.

Operation: `voice.try`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "source_ids": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          }
        ]
      }
    },
    "instruction": {
      "type": "string",
      "maxLength": 2000
    }
  }
}
```

### op_voice_infer

Execute IndieLogs voice.infer operation.

Operation: `voice.infer`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_voice_suggestions_list

Execute IndieLogs voice.suggestions.list operation.

Operation: `voice.suggestions.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_voice_suggestions_decide

Execute IndieLogs voice.suggestions.decide operation.

Operation: `voice.suggestions.decide`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "decision": {
      "type": "string",
      "enum": [
        "accept",
        "dismiss"
      ]
    }
  },
  "required": [
    "id",
    "decision"
  ]
}
```

### op_voice_import

Execute IndieLogs voice.import operation.

Operation: `voice.import`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "input": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "source": {
              "type": "string",
              "const": "url"
            },
            "url": {
              "type": "string",
              "format": "uri"
            }
          },
          "required": [
            "source",
            "url"
          ],
          "additionalProperties": {}
        },
        {
          "type": "object",
          "properties": {
            "source": {
              "type": "string",
              "enum": [
                "x",
                "linkedin"
              ]
            },
            "url": {
              "type": "string",
              "format": "uri"
            }
          },
          "required": [
            "source"
          ],
          "additionalProperties": {}
        }
      ]
    }
  },
  "required": [
    "input"
  ]
}
```

### op_voice_examples_list

Execute IndieLogs voice.examples.list operation.

Operation: `voice.examples.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_voice_examples_create

Execute IndieLogs voice.examples.create operation.

Operation: `voice.examples.create`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "source": {
      "type": "string",
      "maxLength": 80
    },
    "weight": {
      "type": "string",
      "maxLength": 40
    },
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "text"
  ]
}
```

### op_voice_examples_update

Execute IndieLogs voice.examples.update operation.

Operation: `voice.examples.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "text": {
      "type": "string",
      "maxLength": 10000
    },
    "weight": {
      "type": "string",
      "maxLength": 40
    }
  },
  "required": [
    "id"
  ]
}
```

### op_voice_examples_delete

Execute IndieLogs voice.examples.delete operation.

Operation: `voice.examples.delete`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_notifications_list

Execute IndieLogs notifications.list operation.

Operation: `notifications.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_notifications_read

Execute IndieLogs notifications.read operation.

Operation: `notifications.read`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  }
}
```

### op_notification_preferences_read

Execute IndieLogs notification-preferences.read operation.

Operation: `notification-preferences.read`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_notification_preferences_update

Execute IndieLogs notification-preferences.update operation.

Operation: `notification-preferences.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "in_app": {
      "type": "boolean"
    },
    "email_digest": {
      "type": "boolean"
    },
    "product_updates": {
      "type": "boolean"
    },
    "kinds": {
      "type": "object",
      "properties": {
        "draft_held": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "press_soon": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "published": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "weekly_edition_sent": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "new_follower": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "cheers_digest": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "payment_failed": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "update_reply": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        }
      }
    }
  }
}
```

### op_account_export

Execute IndieLogs account.export operation.

Operation: `account.export`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_settings_read

Execute IndieLogs settings.read operation.

Operation: `settings.read`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_settings_update

Execute IndieLogs settings.update operation.

Operation: `settings.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "pattern": "^[a-zA-Z0-9]{1,20}$"
    },
    "full_name": {
      "type": "string",
      "maxLength": 80
    },
    "description": {
      "type": "string",
      "maxLength": 80
    },
    "website": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "avatar_url": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "string",
              "const": ""
            },
            {
              "type": "string",
              "maxLength": 2048,
              "format": "uri"
            }
          ]
        },
        {
          "type": "string",
          "pattern": "^uploads\\/[a-zA-Z0-9/-]+\\.(?:webp|png|jpg|jpeg)$"
        }
      ]
    },
    "onboarding": {
      "type": "string",
      "enum": [
        "completed"
      ]
    },
    "socials": {
      "maxItems": 12,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 30
          },
          "link": {
            "anyOf": [
              {
                "type": "string",
                "const": ""
              },
              {
                "type": "string",
                "maxLength": 2048,
                "format": "uri"
              }
            ]
          }
        },
        "required": [
          "label",
          "link"
        ]
      }
    },
    "timezone": {
      "type": "string",
      "maxLength": 100
    },
    "theme": {
      "type": "string",
      "enum": [
        "indielogs",
        "classic",
        "chainvision",
        "imagenmia",
        "light",
        "dark",
        "cupcake",
        "bumblebee",
        "emerald",
        "corporate",
        "synthwave",
        "retro",
        "cyberpunk",
        "valentine",
        "halloween",
        "garden",
        "forest",
        "aqua",
        "lofi",
        "pastel",
        "fantasy",
        "wireframe",
        "black",
        "luxury",
        "dracula",
        "cmyk",
        "autumn",
        "business",
        "acid",
        "lemonade",
        "night",
        "coffee",
        "winter",
        "sunset",
        "dim",
        "nord"
      ]
    }
  }
}
```

### list_tokens

List your agent tokens without secrets.

Operation: `tokens.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### create_token

Create a scoped revocable token.

Operation: `tokens.create`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "scopes": {
      "maxItems": 13,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "projects:read",
          "updates:read",
          "drafts:write",
          "updates:publish",
          "tokens:manage",
          "projects:write",
          "sources:read",
          "sources:write",
          "voice:read",
          "voice:write",
          "account:read",
          "account:write",
          "account:export"
        ]
      }
    },
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "startup_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "ttl_days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 365
    }
  }
}
```

### revoke_token

Revoke an owned token.

Operation: `tokens.revoke`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ]
}
```

### op_follows_list

Execute IndieLogs follows.list operation.

Operation: `follows.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_follows_create

Execute IndieLogs follows.create operation.

Operation: `follows.create`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "target_type": {
      "type": "string",
      "enum": [
        "user",
        "project"
      ]
    },
    "target_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "target_type",
    "target_id"
  ]
}
```

### op_follows_delete

Execute IndieLogs follows.delete operation.

Operation: `follows.delete`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "target_type": {
      "type": "string",
      "enum": [
        "user",
        "project"
      ]
    },
    "target_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "target_type",
    "target_id"
  ]
}
```

### op_sources_commits_list

Execute IndieLogs sources.commits.list operation.

Operation: `sources.commits.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_groups_list

Execute IndieLogs sources.groups.list operation.

Operation: `sources.groups.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_webhook_status

Execute IndieLogs sources.webhook-status operation.

Operation: `sources.webhook-status`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_list

Execute IndieLogs sources.list operation.

Operation: `sources.list`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_sources_disconnect

Execute IndieLogs sources.disconnect operation.

Operation: `sources.disconnect`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "enum": [
        "github",
        "x",
        "linkedin"
      ]
    }
  },
  "required": [
    "provider"
  ]
}
```

### op_sources_update

Execute IndieLogs sources.update operation.

Operation: `sources.update`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "policy": {
      "type": "string",
      "enum": [
        "review",
        "veto",
        "auto"
      ]
    },
    "veto_minutes": {
      "type": "integer",
      "minimum": 0,
      "maximum": 10080
    },
    "press_time": {
      "type": "string",
      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$"
    },
    "max_per_day": {
      "type": "number",
      "const": 1
    },
    "quiet_minutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1440
    },
    "hold_customer_mentions": {
      "type": "boolean"
    },
    "weekly_edition": {
      "type": "boolean"
    },
    "edition_day": {
      "type": "integer",
      "minimum": 1,
      "maximum": 7
    },
    "edition_time": {
      "type": "string",
      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$"
    },
    "skip_kinds": {
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      }
    },
    "notes_globs": {
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 300
      }
    },
    "screenshot_urls": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "const": ""
          },
          {
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          }
        ]
      }
    },
    "outputs": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "anyOf": [
          {
            "type": "boolean"
          },
          {
            "type": "string",
            "enum": [
              "exact",
              "range",
              "milestones",
              "off"
            ]
          }
        ]
      }
    },
    "timezone": {
      "type": "string",
      "maxLength": 100
    },
    "enabled": {
      "type": "boolean"
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_link

Execute IndieLogs sources.link operation.

Operation: `sources.link`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "repository": {
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "installation_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "repository_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_github_configure

Execute IndieLogs sources.github.configure operation.

Operation: `sources.github.configure`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "branch": {
      "type": "string",
      "maxLength": 200
    },
    "excluded_paths": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 300
      }
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_github_repositories

Execute IndieLogs sources.github.repositories operation.

Operation: `sources.github.repositories`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}
```

### op_sources_github_unlink

Execute IndieLogs sources.github.unlink operation.

Operation: `sources.github.unlink`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_capture

Execute IndieLogs sources.capture operation.

Operation: `sources.capture`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "register_only": {
      "type": "boolean"
    }
  },
  "required": [
    "project_id",
    "url"
  ]
}
```

### op_sources_revenue_settings

Execute IndieLogs sources.revenue-settings operation.

Operation: `sources.revenue-settings`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "display": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "string",
          "enum": [
            "exact",
            "range",
            "milestones",
            "off"
          ]
        }
      ]
    }
  },
  "required": [
    "project_id",
    "display"
  ]
}
```

### op_sources_revenue_status

Execute IndieLogs sources.revenue-status operation.

Operation: `sources.revenue-status`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_revenue_disconnect

Execute IndieLogs sources.revenue-disconnect operation.

Operation: `sources.revenue-disconnect`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

### op_sources_revenue_refresh

Execute IndieLogs sources.revenue-refresh operation.

Operation: `sources.revenue-refresh`

Input schema:

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ]
}
```

---

# Command-line client

Use the repository CLI to call shared operations from a terminal or script.

## Availability

The CLI currently lives in apps/cli and exposes the indielogs executable from the repository package. The repository does not declare a public npm release, so these instructions use the checked-out source rather than implying a published global install.

## Configuration

```text
export INDIELOGS_URL="https://your-indielogs-origin"
# Set INDIELOGS_TOKEN only for private or following-feed operations.
node apps/cli/bin/indielogs.mjs --help
node apps/cli/bin/indielogs.mjs operations
node apps/cli/bin/indielogs.mjs operations --details
```

## Examples

```text
node apps/cli/bin/indielogs.mjs feed --tab everyone --range week
node apps/cli/bin/indielogs.mjs call search.public '{"q":"founder tools"}'
node apps/cli/bin/indielogs.mjs list-projects
node apps/cli/bin/indielogs.mjs draft --project 123 --summary "Added a settings page"
node apps/cli/bin/indielogs.mjs publish DRAFT_UUID
```

## Operational notes

- Public reads do not need a token; private operations and the following feed do.
- The CLI is a bearer-token client. `operations` lists the full registry; `operations --details` shows each operation name and its public, bearer, browser-session, report-capability or conditional access mode, required scope and MCP availability. Registry presence does not guarantee every entry is callable by this client. Browser-session-only operations require the web app; the CLI has no browser-cookie mode.
- Publishing is always an explicit command. Read and draft commands never publish.
- The CLI redacts credentials from console JSON and errors. Use --output only when you need to save a response that includes a newly issued secret; it creates a new file with mode 0600 and refuses to overwrite an existing file.
- Never pass a Supabase service-role key as INDIELOGS_TOKEN.

---

# HTTP API

Send versioned operation envelopes to the canonical API endpoint. Operation input validation comes from the shared contract registry.

## Endpoint

POST /api/v2/execute accepts one version 1 operation envelope. Set INDIELOGS_URL to the public site origin without an API path; the client appends /api/v2/execute. The response is wrapped in data, and failures use an error object with code and message. This public search example runs without a token:

```text
export INDIELOGS_URL="https://your-indielogs-origin"
curl -X POST "$INDIELOGS_URL/api/v2/execute" -H "Content-Type: application/json" -d '{"version":1,"operation":"search.public","input":{"q":"founder tools"}}'
```

## Authenticated read

Create a token in Settings → Tokens, then keep the secret in a protected environment variable. This private read requires projects:read:

```text
export INDIELOGS_TOKEN="<token copied from Settings → Tokens>"
curl -X POST "$INDIELOGS_URL/api/v2/execute" -H "Authorization: Bearer $INDIELOGS_TOKEN" -H "Content-Type: application/json" -d '{"version":1,"operation":"projects.list","input":{}}'
```

## Contract-first operations

Operation names and validation schemas live in packages/contracts/src/operations.ts. The HTTP adapter, MCP tools and CLI use that registry. The list below is generated from that source; it is not a separate schema catalog. Use the shared parser/client for full input validation.

## API availability

Operation access can be public, browser-session-only, bearer-scoped, conditional on an input, or protected by an operation-specific capability. Public operations and MCP-allowed operations are separate sets. The generated operation table reports registry access metadata, not provider configuration or entitlement state for a deployment.

---

# Private AI reports

Generate idea, business model canvas and marketing reports, then retrieve them through a short-lived private capability.

## Generate a report

POST /api/v2/reports/generate is an alias for the shared reports.generate operation. Supported kinds are idea, bmc and marketing. The request is validated by the canonical schema in packages/contracts/src/reports.ts; required inputs depend on the selected kind. The response contains the report and a report_access_token.

```text
curl -X POST "$INDIELOGS_URL/api/v2/reports/generate" \
  -H "Content-Type: application/json" \
  -d '{"kind":"idea","targetMarket":"Independent software founders","ideaDescription":"A tool that turns shipping evidence into a public journal."}'
```

## Read and protect a report

The generated report is private. Its report_access_token is a bearer capability bound to that report and expires after 90 days. Treat it like a password: do not put it in a URL, public post, analytics event or shared log. Generate the report again if the capability expires.

For the operation API, reports.read takes kind, id and report_access_token in the normalized execute input. The legacy GET /api/v2/reports/:kind/:id route accepts X-Report-Access-Token. A browser form stores the capability in an HttpOnly cookie and does not return it in JSON. The capability is not an account API key and grants access only to its report.

```text
curl "$INDIELOGS_URL/api/v2/reports/idea/REPORT_ID" \
  -H "X-Report-Access-Token: $REPORT_ACCESS_TOKEN"
```

## CLI and MCP

reports.generate and reports.read are present in the shared operation registry and exposed through the CLI and MCP definitions. MCP still requires its authenticated, entitled connection and scoped API token. CLI console output redacts credentials; use --output FILE only when you need to retain the raw response. The CLI creates that file with mode 0600 and refuses to overwrite an existing file, so protect and delete it when no longer needed.

- Do not paste a report access token into a command that may be saved in shell history.
- Do not send the capability to an agent unless it needs to read this specific report.
- The CLI currently ships in the repository; these instructions do not imply a public npm release.

## AI Gateway prerequisites

Generation uses the configured AI Gateway and fails closed when required configuration is missing. The deployment operator must configure AI_GATEWAY_API_KEY, AI_REPORT_MODEL and the relevant explicit AUTOPILOT_WRITER_MODEL, AUTOPILOT_HISTORY_MODEL, AUTOPILOT_CLASSIFIER_MODEL and AUTOPILOT_EMBEDDING_MODEL identifiers. Model IDs must be available to that gateway account; configuration alone does not prove provider acceptance. Direct provider API keys are not used as a fallback. OUTBOUND_ENABLED and the applicable generation budget also apply.

---

# Authentication and token scopes

Choose a signed-in browser session for account setup, or a narrowly scoped bearer token for API and agent access.

## Browser session

The web app uses the signed-in account session for private screens and settings. Mutating browser requests are checked against the configured site origin. Do not copy browser cookies into scripts or agents.

## Create a least-privilege token

In the signed-in app, open Settings → Tokens (/settings/tokens). Enter a name, optionally restrict the token to one project, choose an expiry from 1 to 365 days, then select only the needed permissions. Create the token and copy the secret immediately: it is shown once. Save it in a secret manager or protected environment variable, never source control. The active-token list shows scopes, project, last use and expiry; revoke the token there when it is no longer needed. This describes the UI only; no token is created by following these docs.

Each new permission is opt-in. Existing tokens do not gain newly added scopes. Project-scoped tokens can only act within that project; whole-account permissions such as account:read, account:write and account:export require an unscoped token.

- projects:read — Read projects and history.
- updates:read — Read updates and desk.
- drafts:write — Create and edit drafts; rebuild history.
- updates:publish — Publish checked drafts and enable automatic publishing.
- tokens:manage — Manage API tokens.
- projects:write — Create, edit and delete projects; manage chapters.
- sources:read — Read source connections and configuration.
- sources:write — Configure sources, disconnect and refresh verification.
- voice:read — Read writing voice and examples.
- voice:write — Edit voice, import examples and generate voice previews.
- account:read — Read account settings, notifications and billing status.
- account:write — Edit account settings, notifications and follows.
- account:export — Export all account data.

## Limits

The server enforces ownership and scopes for each operation. Following-feed access needs updates:read. CLI and MCP authenticate with bearer credentials and cannot supply the IndieLogs browser session. Operations marked signed-in session only therefore require the web app. OAuth grants, billing checkout and portal actions, provider consent and account deletion remain browser-session flows. Consult the generated per-operation reference before choosing a client.

---

# Shared operation registry

Browse canonical operation names and discover which operations are public, session-only or available to MCP.

## How to read this list

The operation list, access classifications, credential requirements, conditional scopes and MCP allowlist are imported from @indielogs/contracts. MCP tool aliases are imported from @indielogs/mcp. Input schemas remain in the shared registry; this documentation does not redefine them.

## Registered operations

- `revenue.disclosures` — Public; no account credential; —; MCP: op_revenue_disclosures

- `reports.generate` — Public; no account credential; —; MCP: op_reports_generate

- `reports.read` — Per-report capability required; report_access_token; MCP: op_reports_read

- `admin.moderation.list` — Signed-in browser session required; —; MCP: no

- `admin.moderation.decide` — Signed-in browser session required; —; MCP: no

- `admin.moderation.audit` — Signed-in browser session required; —; MCP: no

- `sponsorships.options` — Public; no account credential; —; MCP: op_sponsorships_options

- `sponsorships.create` — Signed-in browser session required; —; MCP: no

- `sponsorships.checkout` — Signed-in browser session required; —; MCP: no

- `sponsorships.mine` — Bearer token required; account:read; MCP: op_sponsorships_mine

- `sponsorships.moderation.list` — Signed-in browser session required; —; MCP: no

- `sponsorships.moderate` — Signed-in browser session required; —; MCP: no

- `sponsorships.active` — Public; no account credential; —; MCP: op_sponsorships_active

- `sponsorships.impression` — Public; no account credential; —; MCP: no

- `sponsorships.click` — Public; no account credential; —; MCP: no

- `search.public` — Public; no account credential; —; MCP: op_search_public

- `outputs.list` — Bearer token required; updates:read; MCP: op_outputs_list

- `outputs.retry` — Bearer token required; updates:publish; MCP: op_outputs_retry

- `billing.read` — Bearer token required; account:read; MCP: op_billing_read

- `billing.checkout` — Signed-in browser session required; —; MCP: no

- `billing.portal` — Signed-in browser session required; —; MCP: no

- `editions.list` — Public; no account credential; —; MCP: op_editions_list

- `editions.get` — Public; no account credential; —; MCP: op_editions_get

- `editions.feed` — Conditional access: tab=following requires updates:read; tab=following: updates:read; MCP: op_editions_feed

- `editions.mine` — Bearer token required; projects:read; MCP: op_editions_mine

- `chapters.list` — Public; no account credential; —; MCP: op_chapters_list

- `chapters.mine` — Bearer token required; projects:read; MCP: op_chapters_mine

- `feed.list` — Conditional access: tab=following requires updates:read; tab=following: updates:read; MCP: op_feed_list

- `profiles.get` — Public; no account credential; —; MCP: op_profiles_get

- `rankings.list` — Public; no account credential; —; MCP: op_rankings_list

- `email-followers.request` — Public; no account credential; —; MCP: no

- `projects.directory` — Public; no account credential; —; MCP: op_projects_directory

- `projects.list` — Bearer token required; projects:read; MCP: list_projects

- `projects.get` — Bearer token required; projects:read; MCP: op_projects_get

- `projects.create` — Bearer token required; projects:write; MCP: op_projects_create

- `projects.update` — Bearer token required; projects:write; MCP: op_projects_update

- `projects.delete` — Bearer token required; projects:write; MCP: op_projects_delete

- `projects.analyze` — Bearer token required; projects:write; MCP: op_projects_analyze

- `updates.list` — Bearer token required; updates:read; MCP: recent_updates

- `updates.publish` — Bearer token required; updates:publish; MCP: op_updates_publish

- `updates.update` — Bearer token required; updates:publish; MCP: op_updates_update

- `updates.delete` — Bearer token required; updates:publish; MCP: op_updates_delete

- `updates.cheer` — Bearer token required; updates:publish; MCP: op_updates_cheer

- `updates.replies.list` — Public; no account credential; —; MCP: op_updates_replies_list

- `updates.replies.create` — Bearer token required; updates:publish; MCP: op_updates_replies_create

- `updates.replies.delete` — Bearer token required; updates:publish; MCP: op_updates_replies_delete

- `drafts.list` — Bearer token required; updates:read; MCP: get_desk

- `drafts.from_evidence` — Bearer token required; drafts:write; MCP: draft_update

- `drafts.get` — Bearer token required; updates:read; MCP: op_drafts_get

- `drafts.create` — Bearer token required; drafts:write; MCP: op_drafts_create

- `drafts.generate` — Bearer token required; drafts:write; MCP: op_drafts_generate

- `drafts.update` — Bearer token required; drafts:write; MCP: op_drafts_update

- `drafts.schedule` — Bearer token required; updates:publish; MCP: op_drafts_schedule

- `drafts.publish` — Bearer token required; updates:publish; MCP: publish_draft

- `drafts.hold` — Bearer token required; drafts:write; MCP: op_drafts_hold

- `drafts.hold-all` — Bearer token required; drafts:write; MCP: op_drafts_hold_all

- `drafts.skip` — Bearer token required; drafts:write; MCP: op_drafts_skip

- `drafts.rewrite` — Bearer token required; drafts:write; MCP: op_drafts_rewrite

- `drafts.release` — Bearer token required; drafts:write; MCP: op_drafts_release

- `drafts.attach_screenshot` — Bearer token required; drafts:write; MCP: attach_screenshot

- `story.publish` — Bearer token required; updates:publish; MCP: op_story_publish

- `story.split` — Bearer token required; projects:write; MCP: op_story_split

- `story.rebuild` — Bearer token required; drafts:write; MCP: op_story_rebuild

- `story.rebuild-status` — Bearer token required; projects:read; MCP: op_story_rebuild_status

- `story.decline` — Bearer token required; projects:write; MCP: op_story_decline

- `story.undo` — Bearer token required; projects:write; MCP: op_story_undo

- `chapters.update` — Bearer token required; projects:write; MCP: op_chapters_update

- `onboarding.complete` — Signed-in browser session required; —; MCP: no

- `voice.read` — Bearer token required; voice:read; MCP: op_voice_read

- `voice.update` — Bearer token required; voice:write; MCP: op_voice_update

- `voice.try` — Bearer token required; voice:write; MCP: op_voice_try

- `voice.infer` — Bearer token required; voice:write; MCP: op_voice_infer

- `voice.suggestions.list` — Bearer token required; voice:read; MCP: op_voice_suggestions_list

- `voice.suggestions.decide` — Bearer token required; voice:write; MCP: op_voice_suggestions_decide

- `voice.import` — Bearer token required; voice:write; MCP: op_voice_import

- `voice.examples.list` — Bearer token required; voice:read; MCP: op_voice_examples_list

- `voice.examples.create` — Bearer token required; voice:write; MCP: op_voice_examples_create

- `voice.examples.update` — Bearer token required; voice:write; MCP: op_voice_examples_update

- `voice.examples.delete` — Bearer token required; voice:write; MCP: op_voice_examples_delete

- `notifications.list` — Bearer token required; account:read; MCP: op_notifications_list

- `notifications.read` — Bearer token required; account:write; MCP: op_notifications_read

- `notification-preferences.read` — Bearer token required; account:read; MCP: op_notification_preferences_read

- `notification-preferences.update` — Bearer token required; account:write; MCP: op_notification_preferences_update

- `account.export` — Bearer token required; account:export; MCP: op_account_export

- `account.deletion-status` — Signed-in browser session required; —; MCP: no

- `account.deletion-request` — Signed-in browser session required; —; MCP: no

- `account.deletion-cancel` — Signed-in browser session required; —; MCP: no

- `settings.read` — Bearer token required; account:read; MCP: op_settings_read

- `settings.update` — Bearer token required; account:write; MCP: op_settings_update

- `tokens.list` — Bearer token required; tokens:manage; MCP: list_tokens

- `tokens.create` — Bearer token required; tokens:manage; MCP: create_token

- `tokens.revoke` — Bearer token required; tokens:manage; MCP: revoke_token

- `follows.list` — Bearer token required; account:read; MCP: op_follows_list

- `follows.create` — Bearer token required; account:write; MCP: op_follows_create

- `follows.delete` — Bearer token required; account:write; MCP: op_follows_delete

- `sources.commits.list` — Bearer token required; drafts:write; MCP: op_sources_commits_list

- `sources.groups.list` — Bearer token required; updates:read; MCP: op_sources_groups_list

- `sources.webhook-status` — Bearer token required; sources:read; MCP: op_sources_webhook_status

- `sources.webhook-configure` — Signed-in browser session required; —; MCP: no

- `sources.webhook-disconnect` — Signed-in browser session required; —; MCP: no

- `sources.list` — Bearer token required; sources:read; MCP: op_sources_list

- `sources.connect` — Signed-in browser session required; —; MCP: no

- `sources.deploy-connect` — Signed-in browser session required; —; MCP: no

- `sources.disconnect` — Bearer token required; sources:write; MCP: op_sources_disconnect

- `sources.update` — Bearer token required; sources:write; MCP: op_sources_update

- `sources.link` — Bearer token required; sources:write; MCP: op_sources_link

- `sources.github.configure` — Bearer token required; sources:write; MCP: op_sources_github_configure

- `sources.github.install` — Signed-in browser session required; —; MCP: no

- `sources.github.repositories` — Bearer token required; sources:read; MCP: op_sources_github_repositories

- `sources.github.unlink` — Bearer token required; sources:write; MCP: op_sources_github_unlink

- `sources.capture` — Bearer token required; sources:write; MCP: op_sources_capture

- `sources.revenue-settings` — Bearer token required; sources:write; MCP: op_sources_revenue_settings

- `sources.revenue-status` — Bearer token required; sources:read; MCP: op_sources_revenue_status

- `sources.revenue-disconnect` — Bearer token required; sources:write; MCP: op_sources_revenue_disconnect

- `sources.revenue-refresh` — Bearer token required; sources:write; MCP: op_sources_revenue_refresh

- `sources.revenue-oauth-start` — Signed-in browser session required; —; MCP: no

- `sources.revenue-connect` — Signed-in browser session required; —; MCP: no

---

# API, MCP and CLI coverage

Choose a client from its actual authentication mode and supported operation set; registry membership alone does not make an operation universal.

## HTTP API

POST /api/v2/execute accepts the full shared operation envelope and validates it against the contract registry. Access requirements vary by operation: account-scoped operations accept an authorized bearer token or signed-in browser session where allowed; reports.read instead needs its per-report capability, and feed.list needs updates:read when tab is following. Browser-session-only operations reject bearer tokens. Use the linked operation reference for exact access metadata and input requirements.

## MCP

MCP exposes the curated mcpOperationNames allowlist through named tools and invoke_operation. It excludes session-only operations, email signup, and sponsor impression/click tracking. Each available tool still uses the operation ownership, entitlement and scope checks.

## CLI

The repository CLI provides convenience commands plus call OPERATION [JSON|-] for shared operations. Run `indielogs operations --details` to inspect each operation name, authentication mode, required scope and MCP availability. The CLI is a bearer-token client with no browser-cookie mode, so browser-session-only operations require the web app. Project ownership, token scope and feature/provider prerequisites still apply.

## Synthetic review-draft example

The following example is intentionally synthetic. Project ID 7 is a placeholder; do not run it against a live workspace. If you replace it with an owned test project and execute it, the operation records evidence and may call the configured AI Gateway, consumes the applicable budget, and creates or reuses a draft for review. It never publishes. It requires drafts:write, an eligible account/project, OUTBOUND_ENABLED and configured Gateway models. Repeating the same key with identical evidence returns the existing result.

```text
node apps/cli/bin/indielogs.mjs agent-draft --project 7 --summary "Synthetic documentation example: add a dark-mode toggle" --why "Synthetic test evidence only; no user data or real commit." --key "docs-example-project-7-dark-mode"
```

## HTTP version of the example

This is the same synthetic example using the normalized API operation. It is documentation only and was not executed:

```text
curl -X POST "$INDIELOGS_URL/api/v2/execute" -H "Authorization: Bearer $INDIELOGS_TOKEN" -H "Content-Type: application/json" -d '{"version":1,"operation":"drafts.from_evidence","input":{"project":7,"summary":"Synthetic documentation example: add a dark-mode toggle","why":"Synthetic test evidence only; no user data or real commit.","idempotencyKey":"docs-example-project-7-dark-mode"}}'
```

## Publishing is separate

Draft creation does not grant publish authority and does not publish automatically. Publishing needs a separate updates:publish scope, an explicit publish operation, and a draft that has passed its review/hold checks. Resolve any hold and review the evidence before publishing.

---

# Outgoing update webhooks

Deliver a signed public update to your own HTTPS receiver and inspect its delivery receipt.

## Configure a destination

Open Sources, choose the project and configure its outgoing webhook. The endpoint must use public HTTPS without URL credentials, a query string or a fragment. Private and local network addresses are rejected. Configuration does not turn on the output: select the separate webhook output switch when you are ready.

Save the one-time signing secret securely. Status reads and exports show only the destination origin, and never return its private path or signing material. Changing the endpoint or rotating the secret creates a new generation. Previously prepared publications are not replayed to the new destination.

## Public event contract

The event type is update.published. Its stable id is indielogs:update: followed by the published update ID. The envelope contains created_at, a public project id/name/slug, the maker username, and the update id, sanitized body_html, public URL, published_at and optional public image/video URLs. It contains no repository evidence, email, provider credentials or private draft context.

History reconstructed during onboarding is excluded from outgoing delivery. Pro entitlement, current output selection, ownership, moderation and account status are rechecked before sending. A delivery acknowledgement does not change the public journal publication.

## Verify the signature

Read the raw UTF-8 body before parsing JSON. The headers are x-indielogs-event-id, x-indielogs-timestamp (Unix seconds) and x-indielogs-signature (sha256= followed by a lowercase hexadecimal HMAC). Decode the part after ilwh_ in the saved secret as base64url bytes. Compute HMAC-SHA256 over eventId + a dot + timestamp + a dot + the raw body, then compare with the supplied digest using a timing-safe comparison.

Reject old timestamps (a five-minute tolerance is a reasonable receiver policy), malformed signatures and event IDs that do not match the body. Deduplicate the stable event ID before applying work. Return a 2xx response only after accepting the event. Redirects are never followed.

## Receipts and retries

Output delivery shows Acknowledged only after the receiver returns 2xx. Failures before the send boundary can be retried explicitly after resolving the configuration or content problem. A timeout, redirect or error after dispatch is uncertain and is not resent automatically; inspect the receiver before taking further action.

Retries retain the first payload snapshot. A successful HTTP request is never repeated merely because saving its local receipt failed. Disconnecting or rotating stops new sends; a request already dispatched may still finish and its actual receipt can settle.

## API, CLI and MCP access

sources.webhook-status is a project-scoped sources:read operation. outputs.list and outputs.retry use the same delivery service in the web app, API, CLI and MCP; retry accepts channel webhook and requires updates:publish. Existing tokens gain no new scopes.

sources.webhook-configure and sources.webhook-disconnect require a signed-in browser session. An agent cannot grant a new external destination by presenting a bearer token. Public operation references document all three contracts, including their browser-only access mode.

---

# Publishing and output channels

Publish a checked update to its IndieLogs journey, with optional external outputs when those are connected and enabled.

## Publish to IndieLogs

- Review the draft title, body, evidence, fact checks, image and publication date.
- Resolve held checks and recheck after editing.
- Publish explicitly from the desk, API or MCP. A publication call does not guarantee any separately configured external output succeeded.

## External output channels

X and LinkedIn delivery require an owner connection, valid provider permissions, channel selection and outbound delivery enabled by the operator. The weekly edition email path requires email configuration and a confirmed subscriber. A changelog embed reads public project content; hiding IndieLogs branding is a plan-gated display option.

Provider connection state, tokens and delivery receipts are independent. A successful IndieLogs publication is not proof of a public X/LinkedIn post or email delivery.

## Deployment controls

- Database writes are guarded by DATABASE_WRITES_ENABLED.
- Provider and AI calls are guarded by OUTBOUND_ENABLED.
- If either gate or a provider prerequisite is missing, the relevant action can fail even when the control is visible.

---

# Voice and AI generation

Configure voice examples and style rules while keeping generated numbers tied to project evidence.

## Voice controls

Voice settings can store traits, rules, banned phrases and examples. You can try a rewrite against supplied text and inspect it before saving or publishing. Voice adaptation does not authorize new factual claims.

## AI Gateway prerequisites

AI tasks use Vercel AI Gateway. The deployment must set AI_GATEWAY_API_KEY and explicit provider/model IDs: AUTOPILOT_WRITER_MODEL, AUTOPILOT_HISTORY_MODEL, AUTOPILOT_CLASSIFIER_MODEL, AUTOPILOT_EMBEDDING_MODEL and AI_REPORT_MODEL for the relevant features. Model availability and provider access belong to the gateway account; a valid model ID alone does not prove a provider accepted a request.

AI generation also depends on OUTBOUND_ENABLED and the user’s daily writing budget. When model configuration, provider access or budget is missing, the operation returns a setup or limit error rather than silently switching to another provider.

## Privacy and accuracy

- The writer is instructed not to invent facts, numbers, customers, revenue or shipped work.
- Numeric claims are checked against source evidence before an automatic publication can proceed.
- Privacy checks can hold a draft for a private path, secret or customer reference. Inspect the draft before release.

---

# Feed, maker pages and charts

Browse public updates and editions, follow projects, and understand what the charts count.

## Feed

The feed has Everyone, Following and Editions views. Update feeds support Recent or Most cheered ordering and all, week, month or year ranges. Cursor pagination uses the returned cursor with the same filters. Following is account-scoped and requires sign-in; API and CLI following reads require updates:read.

## Maker and project pages

Maker pages summarize public project journals, public updates and shipping activity. Project pages show public editions, chapters, updates and an activity calendar. A project owner can see their own repository commit activity; public visitors see public-update activity.

## Charts

- Makers and Projects boards support today, week, month and all-time periods.
- Most updates and longest streak are activity measures. Project charts can be filtered by category.
- Verified MRR requires an eligible revenue connection and feature availability; free-text revenue is not treated as verified.
- Rankings are derived from stored public activity and verified provider data, where available. They do not measure product quality or total founder progress.

---

# Plans and billing

Understand plan-gated features, checkout setup and subscription management boundaries.

## Plan-gated behavior

The app checks the account entitlement before enabling paid capabilities such as automatic publication, MCP and selected embed options. The account’s current plan and access state are authoritative; marketing copy is not proof that a specific account has access.

## Provider setup

Checkout requires the deployment’s Stripe secret key and configured monthly and annual price IDs. Billing webhooks must be configured to keep subscription state current. Legacy Lemon Squeezy records may have a provider portal URL; new checkout behavior and account-specific management depend on the stored provider state.

IndieLogs never changes a connected Stripe account used for revenue reads. Subscription billing is separate from project revenue connections.

## Customer actions

- Use the billing portal when one is available for the account.
- An account deletion request does not cancel a paid subscription; review billing separately.
- Checkout and provider availability must be verified in the target environment before promising purchase readiness.

---

# Errors and troubleshooting

Interpret the shared API error envelope and handle retries without duplicating writes.

## Response shape

Successful calls return a data field. Failed calls return error.code and error.message with an HTTP status. Messages are sanitized for the caller; do not depend on internal provider responses.

## Common statuses

- 400 — invalid JSON, unknown operation or input validation failure.
- 401 — authentication is missing, invalid, expired or no longer usable.
- 403 — missing scope, unsupported operation, account entitlement or origin requirement.
- 404 — resource not found or not visible to this principal.
- 409 — conflicting state, stale version or a review gate that needs action.
- 429 — rate limit or daily AI budget reached. Respect Retry-After when present.
- 503 — provider, database or model configuration is unavailable. Check the deployment prerequisites and retry only after the issue is resolved.

## Safe retries

Do not retry unchanged 400, 401, 402 or 403 errors. Before repeating a write after a timeout, check whether the operation supports an idempotency key or expected version. Refresh a stale draft before retrying publish.

---

# Operation input reference

---

# revenue.disclosures

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_revenue_disclosures).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"revenue.disclosures","input":<input-object matching schema>}

CLI: indielogs call revenue.disclosures '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_ids": {
      "minItems": 1,
      "maxItems": 80,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    }
  },
  "required": [
    "project_ids"
  ],
  "additionalProperties": false
}

```

# reports.generate

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_reports_generate).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"reports.generate","input":<input-object matching schema>}

CLI: indielogs call reports.generate '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "idea",
        "bmc",
        "marketing"
      ]
    },
    "targetMarket": {
      "type": "string",
      "minLength": 2,
      "maxLength": 500
    },
    "ideaDescription": {
      "type": "string",
      "minLength": 8,
      "maxLength": 2000
    },
    "businessIdea": {
      "type": "string",
      "minLength": 8,
      "maxLength": 2000
    },
    "foundingTeam": {
      "type": "string",
      "maxLength": 2000
    },
    "budget": {
      "type": "string",
      "maxLength": 2000
    },
    "monthlyMarketingBudget": {
      "type": "string",
      "maxLength": 2000
    },
    "currentUserBase": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "kind",
    "targetMarket"
  ],
  "additionalProperties": false
}

```

# reports.read

Access: Per-report capability required. Additional credential or scope: report_access_token. MCP allowed: yes (op_reports_read).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"reports.read","input":<input-object matching schema>}

CLI: indielogs call reports.read '<input-json>' (command shape only; the placeholder is not a valid sample input).

The report_access_token in input is a private capability for one report. It is not an account API key; never put it in a URL or share it publicly.

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "idea",
        "bmc",
        "marketing"
      ]
    },
    "id": {
      "type": "string",
      "pattern": "^(?:[1-9]\\d{0,17}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$"
    },
    "report_access_token": {
      "type": "string",
      "minLength": 1,
      "maxLength": 512
    }
  },
  "required": [
    "kind",
    "id",
    "report_access_token"
  ],
  "additionalProperties": false
}

```

# admin.moderation.list

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"admin.moderation.list","input":<input-object matching schema>}

CLI: indielogs call admin.moderation.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "updates",
        "makers"
      ]
    },
    "q": {
      "type": "string",
      "maxLength": 100
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "cursor": {
      "type": "string",
      "maxLength": 600
    }
  },
  "required": [
    "kind"
  ]
}

```

# admin.moderation.decide

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"admin.moderation.decide","input":<input-object matching schema>}

CLI: indielogs call admin.moderation.decide '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "target_type": {
      "type": "string",
      "enum": [
        "update",
        "maker"
      ]
    },
    "target_id": {
      "type": "string",
      "maxLength": 100
    },
    "action": {
      "type": "string",
      "enum": [
        "hide",
        "suspend",
        "restore"
      ]
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    }
  },
  "required": [
    "target_type",
    "target_id",
    "action",
    "reason"
  ]
}

```

# admin.moderation.audit

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"admin.moderation.audit","input":<input-object matching schema>}

CLI: indielogs call admin.moderation.audit '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "target_type": {
      "type": "string",
      "enum": [
        "update",
        "maker"
      ]
    },
    "target_id": {
      "type": "string",
      "maxLength": 100
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "target_type",
    "target_id"
  ]
}

```

# sponsorships.options

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_sponsorships_options).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.options","input":<input-object matching schema>}

CLI: indielogs call sponsorships.options '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

```

# sponsorships.create

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.create","input":<input-object matching schema>}

CLI: indielogs call sponsorships.create '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "starts_on": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "creative": {
      "type": "object",
      "properties": {
        "sponsor_name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        "logo": {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        },
        "headline": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120
        },
        "body": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500
        },
        "url": {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      },
      "required": [
        "sponsor_name",
        "logo",
        "headline",
        "body",
        "url"
      ]
    },
    "idempotency_key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,120}$"
    }
  },
  "required": [
    "starts_on",
    "creative",
    "idempotency_key"
  ]
}

```

# sponsorships.checkout

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.checkout","input":<input-object matching schema>}

CLI: indielogs call sponsorships.checkout '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id"
  ]
}

```

# sponsorships.mine

Access: Bearer token required. Additional credential or scope: account:read. MCP allowed: yes (op_sponsorships_mine).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.mine","input":<input-object matching schema>}

CLI: indielogs call sponsorships.mine '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 500
    }
  }
}

```

# sponsorships.moderation.list

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.moderation.list","input":<input-object matching schema>}

CLI: indielogs call sponsorships.moderation.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 500
    }
  }
}

```

# sponsorships.moderate

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.moderate","input":<input-object matching schema>}

CLI: indielogs call sponsorships.moderate '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "decision": {
      "type": "string",
      "enum": [
        "approved",
        "rejected"
      ]
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    }
  },
  "required": [
    "id",
    "decision",
    "reason"
  ]
}

```

# sponsorships.active

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_sponsorships_active).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.active","input":<input-object matching schema>}

CLI: indielogs call sponsorships.active '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

```

# sponsorships.impression

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.impression","input":<input-object matching schema>}

CLI: indielogs call sponsorships.impression '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "event_key": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id",
    "event_key"
  ]
}

```

# sponsorships.click

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sponsorships.click","input":<input-object matching schema>}

CLI: indielogs call sponsorships.click '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "event_key": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id",
    "event_key"
  ]
}

```

# search.public

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_search_public).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"search.public","input":<input-object matching schema>}

CLI: indielogs call search.public '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "q": {
      "type": "string"
    },
    "kind": {
      "default": "all",
      "type": "string",
      "enum": [
        "all",
        "maker",
        "project",
        "update"
      ]
    },
    "limit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    },
    "cursor": {
      "type": "string",
      "maxLength": 1600
    }
  },
  "required": [
    "q"
  ]
}

```

# outputs.list

Access: Bearer token required. Additional credential or scope: updates:read. MCP allowed: yes (op_outputs_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"outputs.list","input":<input-object matching schema>}

CLI: indielogs call outputs.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "log_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "log_id"
  ],
  "additionalProperties": {}
}

```

# outputs.retry

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_outputs_retry).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"outputs.retry","input":<input-object matching schema>}

CLI: indielogs call outputs.retry '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "log_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "channel": {
      "type": "string",
      "enum": [
        "x",
        "linkedin",
        "webhook"
      ]
    }
  },
  "required": [
    "log_id",
    "channel"
  ],
  "additionalProperties": {}
}

```

# billing.read

Access: Bearer token required. Additional credential or scope: account:read. MCP allowed: yes (op_billing_read).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"billing.read","input":<input-object matching schema>}

CLI: indielogs call billing.read '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# billing.checkout

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"billing.checkout","input":<input-object matching schema>}

CLI: indielogs call billing.checkout '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "interval": {
      "type": "string",
      "enum": [
        "month",
        "year"
      ]
    }
  },
  "required": [
    "interval"
  ],
  "additionalProperties": {}
}

```

# billing.portal

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"billing.portal","input":<input-object matching schema>}

CLI: indielogs call billing.portal '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# editions.list

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_editions_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"editions.list","input":<input-object matching schema>}

CLI: indielogs call editions.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": false
}

```

# editions.get

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_editions_get).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"editions.get","input":<input-object matching schema>}

CLI: indielogs call editions.get '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "iso_year": {
      "type": "integer",
      "minimum": 1900,
      "maximum": 9999
    },
    "iso_week": {
      "type": "integer",
      "minimum": 1,
      "maximum": 53
    }
  },
  "required": [
    "project_id",
    "iso_year",
    "iso_week"
  ],
  "additionalProperties": false
}

```

# editions.feed

Access: Conditional access: tab=following requires updates:read. Additional credential or scope: tab=following: updates:read. MCP allowed: yes (op_editions_feed).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"editions.feed","input":<input-object matching schema>}

CLI: indielogs call editions.feed '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    },
    "tab": {
      "default": "everyone",
      "type": "string",
      "enum": [
        "everyone",
        "following"
      ]
    },
    "range": {
      "default": "all",
      "type": "string",
      "enum": [
        "all",
        "week",
        "month",
        "year"
      ]
    }
  },
  "additionalProperties": false
}

```

# editions.mine

Access: Bearer token required. Additional credential or scope: projects:read. MCP allowed: yes (op_editions_mine).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"editions.mine","input":<input-object matching schema>}

CLI: indielogs call editions.mine '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": false
}

```

# chapters.list

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_chapters_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"chapters.list","input":<input-object matching schema>}

CLI: indielogs call chapters.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": false
}

```

# chapters.mine

Access: Bearer token required. Additional credential or scope: projects:read. MCP allowed: yes (op_chapters_mine).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"chapters.mine","input":<input-object matching schema>}

CLI: indielogs call chapters.mine '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": false
}

```

# feed.list

Access: Conditional access: tab=following requires updates:read. Additional credential or scope: tab=following: updates:read. MCP allowed: yes (op_feed_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"feed.list","input":<input-object matching schema>}

CLI: indielogs call feed.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "cursor": {
      "type": "string",
      "maxLength": 2048
    },
    "sort": {
      "type": "string",
      "enum": [
        "recent",
        "trending"
      ]
    },
    "range": {
      "type": "string",
      "enum": [
        "all",
        "week",
        "month",
        "year"
      ]
    },
    "tab": {
      "type": "string",
      "enum": [
        "everyone",
        "following"
      ]
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "additionalProperties": {}
}

```

# profiles.get

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_profiles_get).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"profiles.get","input":<input-object matching schema>}

CLI: indielogs call profiles.get '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    }
  },
  "required": [
    "username"
  ],
  "additionalProperties": {}
}

```

# rankings.list

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_rankings_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"rankings.list","input":<input-object matching schema>}

CLI: indielogs call rankings.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "board": {
      "type": "string",
      "enum": [
        "makers",
        "projects"
      ]
    },
    "period": {
      "type": "string",
      "enum": [
        "today",
        "week",
        "month",
        "all"
      ]
    },
    "metric": {
      "type": "string",
      "enum": [
        "updates",
        "streak",
        "mrr",
        "revenue"
      ]
    },
    "category": {
      "type": "string",
      "maxLength": 80
    },
    "type": {
      "type": "string",
      "enum": [
        "founder",
        "startup"
      ]
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "additionalProperties": {}
}

```

# email-followers.request

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"email-followers.request","input":<input-object matching schema>}

CLI: indielogs call email-followers.request '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "maxLength": 254,
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "target_type": {
      "type": "string",
      "enum": [
        "user",
        "project"
      ]
    },
    "target_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "email",
    "target_type",
    "target_id"
  ],
  "additionalProperties": {}
}

```

# projects.directory

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_projects_directory).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"projects.directory","input":<input-object matching schema>}

CLI: indielogs call projects.directory '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "maxLength": 80
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "additionalProperties": {}
}

```

# projects.list

Access: Bearer token required. Additional credential or scope: projects:read. MCP allowed: yes (list_projects).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"projects.list","input":<input-object matching schema>}

CLI: indielogs call projects.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# projects.get

Access: Bearer token required. Additional credential or scope: projects:read. MCP allowed: yes (op_projects_get).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"projects.get","input":<input-object matching schema>}

CLI: indielogs call projects.get '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# projects.create

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_projects_create).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"projects.create","input":<input-object matching schema>}

CLI: indielogs call projects.create '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "status": {
      "type": "string",
      "maxLength": 60
    },
    "url": {
      "type": "string",
      "maxLength": 2048
    },
    "logo": {
      "type": "string",
      "maxLength": 2048
    },
    "category": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "slug": {
      "type": "string",
      "maxLength": 120
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": {}
}

```

# projects.update

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_projects_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"projects.update","input":<input-object matching schema>}

CLI: indielogs call projects.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "status": {
      "type": "string",
      "maxLength": 60
    },
    "url": {
      "type": "string",
      "maxLength": 2048
    },
    "logo": {
      "type": "string",
      "maxLength": 2048
    },
    "category": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "slug": {
      "type": "string",
      "maxLength": 120
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# projects.delete

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_projects_delete).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"projects.delete","input":<input-object matching schema>}

CLI: indielogs call projects.delete '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# projects.analyze

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_projects_analyze).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"projects.analyze","input":<input-object matching schema>}

CLI: indielogs call projects.analyze '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": {}
}

```

# updates.list

Access: Bearer token required. Additional credential or scope: updates:read. MCP allowed: yes (recent_updates).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.list","input":<input-object matching schema>}

CLI: indielogs call updates.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "additionalProperties": {}
}

```

# updates.publish

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_updates_publish).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.publish","input":<input-object matching schema>}

CLI: indielogs call updates.publish '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "string",
          "pattern": "^[1-9]\\d*$"
        }
      ]
    },
    "description": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "date": {
      "type": "string"
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "video": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "items": {
      "maxItems": 16,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 280
      }
    },
    "idempotencyKey": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,200}$"
    }
  },
  "required": [
    "project_id",
    "description"
  ],
  "additionalProperties": {}
}

```

# updates.update

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_updates_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.update","input":<input-object matching schema>}

CLI: indielogs call updates.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "date": {
      "type": [
        "string",
        "null"
      ]
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "video": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "items": {
      "maxItems": 16,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 280
      }
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# updates.delete

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_updates_delete).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.delete","input":<input-object matching schema>}

CLI: indielogs call updates.delete '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# updates.cheer

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_updates_cheer).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.cheer","input":<input-object matching schema>}

CLI: indielogs call updates.cheer '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# updates.replies.list

Access: Public; no account credential. Additional credential or scope: —. MCP allowed: yes (op_updates_replies_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.replies.list","input":<input-object matching schema>}

CLI: indielogs call updates.replies.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# updates.replies.create

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_updates_replies_create).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.replies.create","input":<input-object matching schema>}

CLI: indielogs call updates.replies.create '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "body_html": {
      "type": "string",
      "maxLength": 2000
    },
    "description": {
      "type": "string",
      "maxLength": 2000
    },
    "text": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# updates.replies.delete

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_updates_replies_delete).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"updates.replies.delete","input":<input-object matching schema>}

CLI: indielogs call updates.replies.delete '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "reply_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.list

Access: Bearer token required. Additional credential or scope: updates:read. MCP allowed: yes (get_desk).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.list","input":<input-object matching schema>}

CLI: indielogs call drafts.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "statuses": {
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "waiting",
          "held",
          "queued",
          "published",
          "skipped"
        ]
      }
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740892
    },
    "query": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "additionalProperties": {}
}

```

# drafts.from_evidence

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (draft_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.from_evidence","input":<input-object matching schema>}

CLI: indielogs call drafts.from_evidence '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 100,
          "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
        }
      ]
    },
    "summary": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "why": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "commits": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "numbers": {
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
              }
            ]
          },
          "source": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000
          }
        },
        "required": [
          "value",
          "source"
        ],
        "additionalProperties": false
      }
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "project",
    "summary"
  ],
  "additionalProperties": false
}

```

# drafts.get

Access: Bearer token required. Additional credential or scope: updates:read. MCP allowed: yes (op_drafts_get).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.get","input":<input-object matching schema>}

CLI: indielogs call drafts.get '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.create

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_create).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.create","input":<input-object matching schema>}

CLI: indielogs call drafts.create '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "summary": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "title": {
      "type": "string",
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "why": {
      "type": "string",
      "maxLength": 2000
    },
    "commits": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "scheduled_for": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "publication_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "visual": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "card",
            "screenshot",
            "none"
          ]
        },
        "card": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 100
            },
            {
              "type": "object",
              "properties": {
                "k": {
                  "type": "string",
                  "maxLength": 100
                },
                "big": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 100
                    },
                    {
                      "type": "number"
                    }
                  ]
                },
                "sub": {
                  "type": "string",
                  "maxLength": 300
                }
              },
              "required": [
                "k",
                "big",
                "sub"
              ]
            }
          ]
        },
        "url": {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        },
        "caption": {
          "type": "string",
          "maxLength": 500
        }
      },
      "required": [
        "kind"
      ]
    },
    "variants": {
      "type": "object",
      "properties": {
        "x": {
          "type": "string",
          "maxLength": 3000
        },
        "linkedin": {
          "type": "string",
          "maxLength": 3000
        },
        "outputs": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "boolean"
          }
        }
      }
    },
    "idempotencyKey": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,200}$"
    }
  },
  "required": [
    "project_id",
    "summary"
  ],
  "additionalProperties": {}
}

```

# drafts.generate

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_generate).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.generate","input":<input-object matching schema>}

CLI: indielogs call drafts.generate '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "source_ids": {
      "minItems": 1,
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "project_id",
    "source_ids"
  ],
  "additionalProperties": {}
}

```

# drafts.update

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.update","input":<input-object matching schema>}

CLI: indielogs call drafts.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "maxLength": 10000
    },
    "title": {
      "type": "string",
      "maxLength": 200
    },
    "scheduled_for": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "publication_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "visual": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "card",
            "screenshot",
            "none"
          ]
        },
        "card": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 100
            },
            {
              "type": "object",
              "properties": {
                "k": {
                  "type": "string",
                  "maxLength": 100
                },
                "big": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 100
                    },
                    {
                      "type": "number"
                    }
                  ]
                },
                "sub": {
                  "type": "string",
                  "maxLength": 300
                }
              },
              "required": [
                "k",
                "big",
                "sub"
              ]
            }
          ]
        },
        "url": {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        },
        "caption": {
          "type": "string",
          "maxLength": 500
        }
      },
      "required": [
        "kind"
      ]
    },
    "variants": {
      "type": "object",
      "properties": {
        "x": {
          "type": "string",
          "maxLength": 3000
        },
        "linkedin": {
          "type": "string",
          "maxLength": 3000
        },
        "outputs": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "boolean"
          }
        }
      }
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.schedule

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_drafts_schedule).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.schedule","input":<input-object matching schema>}

CLI: indielogs call drafts.schedule '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "scheduled_for": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "id",
    "scheduled_for",
    "expected_updated_at"
  ],
  "additionalProperties": {}
}

```

# drafts.publish

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (publish_draft).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.publish","input":<input-object matching schema>}

CLI: indielogs call drafts.publish '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "confirm_unverified": {
      "type": "boolean"
    },
    "acknowledgement": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.hold

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_hold).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.hold","input":<input-object matching schema>}

CLI: indielogs call drafts.hold '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.hold-all

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_hold_all).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.hold-all","input":<input-object matching schema>}

CLI: indielogs call drafts.hold-all '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# drafts.skip

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_skip).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.skip","input":<input-object matching schema>}

CLI: indielogs call drafts.skip '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.rewrite

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_rewrite).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.rewrite","input":<input-object matching schema>}

CLI: indielogs call drafts.rewrite '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "instruction": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.release

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_drafts_release).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.release","input":<input-object matching schema>}

CLI: indielogs call drafts.release '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# drafts.attach_screenshot

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (attach_screenshot).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"drafts.attach_screenshot","input":<input-object matching schema>}

CLI: indielogs call drafts.attach_screenshot '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "expected_updated_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "image_base64": {
      "type": "string",
      "maxLength": 14000000
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "caption": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# story.publish

Access: Bearer token required. Additional credential or scope: updates:publish. MCP allowed: yes (op_story_publish).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"story.publish","input":<input-object matching schema>}

CLI: indielogs call story.publish '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# story.split

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_story_split).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"story.split","input":<input-object matching schema>}

CLI: indielogs call story.split '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# story.rebuild

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_story_rebuild).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"story.rebuild","input":<input-object matching schema>}

CLI: indielogs call story.rebuild '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "lookback_days": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 36500
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": false
}

```

# story.rebuild-status

Access: Bearer token required. Additional credential or scope: projects:read. MCP allowed: yes (op_story_rebuild_status).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"story.rebuild-status","input":<input-object matching schema>}

CLI: indielogs call story.rebuild-status '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": false
}

```

# story.decline

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_story_decline).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"story.decline","input":<input-object matching schema>}

CLI: indielogs call story.decline '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "edition_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "reason": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# story.undo

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_story_undo).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"story.undo","input":<input-object matching schema>}

CLI: indielogs call story.undo '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "edition_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# chapters.update

Access: Bearer token required. Additional credential or scope: projects:write. MCP allowed: yes (op_chapters_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"chapters.update","input":<input-object matching schema>}

CLI: indielogs call chapters.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "title": {
      "type": "string",
      "maxLength": 120
    },
    "hidden": {
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# onboarding.complete

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"onboarding.complete","input":<input-object matching schema>}

CLI: indielogs call onboarding.complete '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "username": {
      "type": "string",
      "maxLength": 20
    },
    "full_name": {
      "type": "string",
      "maxLength": 80
    },
    "timezone": {
      "type": "string",
      "maxLength": 100
    },
    "project": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# voice.read

Access: Bearer token required. Additional credential or scope: voice:read. MCP allowed: yes (op_voice_read).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.read","input":<input-object matching schema>}

CLI: indielogs call voice.read '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# voice.update

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.update","input":<input-object matching schema>}

CLI: indielogs call voice.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "traits": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number",
        "minimum": 0,
        "maximum": 100
      }
    },
    "rules": {
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 300
      }
    },
    "banned_phrases": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      }
    }
  },
  "additionalProperties": {}
}

```

# voice.try

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_try).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.try","input":<input-object matching schema>}

CLI: indielogs call voice.try '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "source_ids": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          }
        ]
      }
    },
    "instruction": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "additionalProperties": {}
}

```

# voice.infer

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_infer).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.infer","input":<input-object matching schema>}

CLI: indielogs call voice.infer '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# voice.suggestions.list

Access: Bearer token required. Additional credential or scope: voice:read. MCP allowed: yes (op_voice_suggestions_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.suggestions.list","input":<input-object matching schema>}

CLI: indielogs call voice.suggestions.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# voice.suggestions.decide

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_suggestions_decide).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.suggestions.decide","input":<input-object matching schema>}

CLI: indielogs call voice.suggestions.decide '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "decision": {
      "type": "string",
      "enum": [
        "accept",
        "dismiss"
      ]
    }
  },
  "required": [
    "id",
    "decision"
  ],
  "additionalProperties": {}
}

```

# voice.import

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_import).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.import","input":<input-object matching schema>}

CLI: indielogs call voice.import '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "const": "url"
        },
        "url": {
          "type": "string",
          "format": "uri"
        }
      },
      "required": [
        "source",
        "url"
      ],
      "additionalProperties": {}
    },
    {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "enum": [
            "x",
            "linkedin"
          ]
        },
        "url": {
          "type": "string",
          "format": "uri"
        }
      },
      "required": [
        "source"
      ],
      "additionalProperties": {}
    }
  ]
}

```

# voice.examples.list

Access: Bearer token required. Additional credential or scope: voice:read. MCP allowed: yes (op_voice_examples_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.examples.list","input":<input-object matching schema>}

CLI: indielogs call voice.examples.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# voice.examples.create

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_examples_create).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.examples.create","input":<input-object matching schema>}

CLI: indielogs call voice.examples.create '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    },
    "source": {
      "type": "string",
      "maxLength": 80
    },
    "weight": {
      "type": "string",
      "maxLength": 40
    },
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "text"
  ],
  "additionalProperties": {}
}

```

# voice.examples.update

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_examples_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.examples.update","input":<input-object matching schema>}

CLI: indielogs call voice.examples.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "text": {
      "type": "string",
      "maxLength": 10000
    },
    "weight": {
      "type": "string",
      "maxLength": 40
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# voice.examples.delete

Access: Bearer token required. Additional credential or scope: voice:write. MCP allowed: yes (op_voice_examples_delete).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"voice.examples.delete","input":<input-object matching schema>}

CLI: indielogs call voice.examples.delete '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# notifications.list

Access: Bearer token required. Additional credential or scope: account:read. MCP allowed: yes (op_notifications_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"notifications.list","input":<input-object matching schema>}

CLI: indielogs call notifications.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# notifications.read

Access: Bearer token required. Additional credential or scope: account:write. MCP allowed: yes (op_notifications_read).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"notifications.read","input":<input-object matching schema>}

CLI: indielogs call notifications.read '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "additionalProperties": {}
}

```

# notification-preferences.read

Access: Bearer token required. Additional credential or scope: account:read. MCP allowed: yes (op_notification_preferences_read).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"notification-preferences.read","input":<input-object matching schema>}

CLI: indielogs call notification-preferences.read '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# notification-preferences.update

Access: Bearer token required. Additional credential or scope: account:write. MCP allowed: yes (op_notification_preferences_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"notification-preferences.update","input":<input-object matching schema>}

CLI: indielogs call notification-preferences.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "in_app": {
      "type": "boolean"
    },
    "email_digest": {
      "type": "boolean"
    },
    "product_updates": {
      "type": "boolean"
    },
    "kinds": {
      "type": "object",
      "properties": {
        "draft_held": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "press_soon": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "published": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "weekly_edition_sent": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "new_follower": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "cheers_digest": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "payment_failed": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        },
        "update_reply": {
          "type": "object",
          "properties": {
            "in_app": {
              "type": "boolean"
            },
            "email": {
              "type": "boolean"
            }
          }
        }
      }
    }
  }
}

```

# account.export

Access: Bearer token required. Additional credential or scope: account:export. MCP allowed: yes (op_account_export).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"account.export","input":<input-object matching schema>}

CLI: indielogs call account.export '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

```

# account.deletion-status

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"account.deletion-status","input":<input-object matching schema>}

CLI: indielogs call account.deletion-status '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

```

# account.deletion-request

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"account.deletion-request","input":<input-object matching schema>}

CLI: indielogs call account.deletion-request '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "confirmation": {
      "type": "string",
      "const": "DELETE ACCOUNT"
    },
    "expected_version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "confirmation"
  ],
  "additionalProperties": false
}

```

# account.deletion-cancel

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"account.deletion-cancel","input":<input-object matching schema>}

CLI: indielogs call account.deletion-cancel '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "expected_version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "expected_version"
  ],
  "additionalProperties": false
}

```

# settings.read

Access: Bearer token required. Additional credential or scope: account:read. MCP allowed: yes (op_settings_read).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"settings.read","input":<input-object matching schema>}

CLI: indielogs call settings.read '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# settings.update

Access: Bearer token required. Additional credential or scope: account:write. MCP allowed: yes (op_settings_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"settings.update","input":<input-object matching schema>}

CLI: indielogs call settings.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "pattern": "^[a-zA-Z0-9]{1,20}$"
    },
    "full_name": {
      "type": "string",
      "maxLength": 80
    },
    "description": {
      "type": "string",
      "maxLength": 80
    },
    "website": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        }
      ]
    },
    "avatar_url": {
      "anyOf": [
        {
          "anyOf": [
            {
              "type": "string",
              "const": ""
            },
            {
              "type": "string",
              "maxLength": 2048,
              "format": "uri"
            }
          ]
        },
        {
          "type": "string",
          "pattern": "^uploads\\/[a-zA-Z0-9/-]+\\.(?:webp|png|jpg|jpeg)$"
        }
      ]
    },
    "onboarding": {
      "type": "string",
      "enum": [
        "completed"
      ]
    },
    "socials": {
      "maxItems": 12,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 30
          },
          "link": {
            "anyOf": [
              {
                "type": "string",
                "const": ""
              },
              {
                "type": "string",
                "maxLength": 2048,
                "format": "uri"
              }
            ]
          }
        },
        "required": [
          "label",
          "link"
        ]
      }
    },
    "timezone": {
      "type": "string",
      "maxLength": 100
    },
    "theme": {
      "type": "string",
      "enum": [
        "indielogs",
        "classic",
        "chainvision",
        "imagenmia",
        "light",
        "dark",
        "cupcake",
        "bumblebee",
        "emerald",
        "corporate",
        "synthwave",
        "retro",
        "cyberpunk",
        "valentine",
        "halloween",
        "garden",
        "forest",
        "aqua",
        "lofi",
        "pastel",
        "fantasy",
        "wireframe",
        "black",
        "luxury",
        "dracula",
        "cmyk",
        "autumn",
        "business",
        "acid",
        "lemonade",
        "night",
        "coffee",
        "winter",
        "sunset",
        "dim",
        "nord"
      ]
    }
  },
  "additionalProperties": {}
}

```

# tokens.list

Access: Bearer token required. Additional credential or scope: tokens:manage. MCP allowed: yes (list_tokens).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"tokens.list","input":<input-object matching schema>}

CLI: indielogs call tokens.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# tokens.create

Access: Bearer token required. Additional credential or scope: tokens:manage. MCP allowed: yes (create_token).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"tokens.create","input":<input-object matching schema>}

CLI: indielogs call tokens.create '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "scopes": {
      "maxItems": 13,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "projects:read",
          "updates:read",
          "drafts:write",
          "updates:publish",
          "tokens:manage",
          "projects:write",
          "sources:read",
          "sources:write",
          "voice:read",
          "voice:write",
          "account:read",
          "account:write",
          "account:export"
        ]
      }
    },
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "startup_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "ttl_days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 365
    }
  },
  "additionalProperties": {}
}

```

# tokens.revoke

Access: Bearer token required. Additional credential or scope: tokens:manage. MCP allowed: yes (revoke_token).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"tokens.revoke","input":<input-object matching schema>}

CLI: indielogs call tokens.revoke '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": {}
}

```

# follows.list

Access: Bearer token required. Additional credential or scope: account:read. MCP allowed: yes (op_follows_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"follows.list","input":<input-object matching schema>}

CLI: indielogs call follows.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# follows.create

Access: Bearer token required. Additional credential or scope: account:write. MCP allowed: yes (op_follows_create).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"follows.create","input":<input-object matching schema>}

CLI: indielogs call follows.create '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "target_type": {
      "type": "string",
      "enum": [
        "user",
        "project"
      ]
    },
    "target_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "target_type",
    "target_id"
  ],
  "additionalProperties": {}
}

```

# follows.delete

Access: Bearer token required. Additional credential or scope: account:write. MCP allowed: yes (op_follows_delete).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"follows.delete","input":<input-object matching schema>}

CLI: indielogs call follows.delete '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "target_type": {
      "type": "string",
      "enum": [
        "user",
        "project"
      ]
    },
    "target_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "target_type",
    "target_id"
  ],
  "additionalProperties": {}
}

```

# sources.commits.list

Access: Bearer token required. Additional credential or scope: drafts:write. MCP allowed: yes (op_sources_commits_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.commits.list","input":<input-object matching schema>}

CLI: indielogs call sources.commits.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.groups.list

Access: Bearer token required. Additional credential or scope: updates:read. MCP allowed: yes (op_sources_groups_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.groups.list","input":<input-object matching schema>}

CLI: indielogs call sources.groups.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.webhook-status

Access: Bearer token required. Additional credential or scope: sources:read. MCP allowed: yes (op_sources_webhook_status).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.webhook-status","input":<input-object matching schema>}

CLI: indielogs call sources.webhook-status '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.webhook-configure

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.webhook-configure","input":<input-object matching schema>}

CLI: indielogs call sources.webhook-configure '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "url": {
      "type": "string",
      "maxLength": 2048,
      "format": "uri"
    }
  },
  "required": [
    "project_id",
    "url"
  ],
  "additionalProperties": {}
}

```

# sources.webhook-disconnect

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.webhook-disconnect","input":<input-object matching schema>}

CLI: indielogs call sources.webhook-disconnect '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.list

Access: Bearer token required. Additional credential or scope: sources:read. MCP allowed: yes (op_sources_list).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.list","input":<input-object matching schema>}

CLI: indielogs call sources.list '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# sources.connect

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.connect","input":<input-object matching schema>}

CLI: indielogs call sources.connect '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "provider": {
      "type": "string",
      "enum": [
        "github",
        "x",
        "linkedin"
      ]
    }
  },
  "additionalProperties": {}
}

```

# sources.deploy-connect

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.deploy-connect","input":<input-object matching schema>}

CLI: indielogs call sources.deploy-connect '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "provider": {
      "type": "string",
      "enum": [
        "custom",
        "generic",
        "vercel",
        "netlify",
        "render",
        "coolify"
      ]
    },
    "provider_resource_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "pattern": "^[A-Za-z0-9_-]+$"
    },
    "signing_secret": {
      "type": "string",
      "minLength": 16,
      "maxLength": 1000
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.disconnect

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_disconnect).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.disconnect","input":<input-object matching schema>}

CLI: indielogs call sources.disconnect '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "enum": [
        "github",
        "x",
        "linkedin"
      ]
    }
  },
  "required": [
    "provider"
  ],
  "additionalProperties": {}
}

```

# sources.update

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_update).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.update","input":<input-object matching schema>}

CLI: indielogs call sources.update '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "policy": {
      "type": "string",
      "enum": [
        "review",
        "veto",
        "auto"
      ]
    },
    "veto_minutes": {
      "type": "integer",
      "minimum": 0,
      "maximum": 10080
    },
    "press_time": {
      "type": "string",
      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$"
    },
    "max_per_day": {
      "type": "number",
      "const": 1
    },
    "quiet_minutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1440
    },
    "hold_customer_mentions": {
      "type": "boolean"
    },
    "weekly_edition": {
      "type": "boolean"
    },
    "edition_day": {
      "type": "integer",
      "minimum": 1,
      "maximum": 7
    },
    "edition_time": {
      "type": "string",
      "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$"
    },
    "skip_kinds": {
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      }
    },
    "notes_globs": {
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 300
      }
    },
    "screenshot_urls": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "const": ""
          },
          {
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          }
        ]
      }
    },
    "outputs": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "anyOf": [
          {
            "type": "boolean"
          },
          {
            "type": "string",
            "enum": [
              "exact",
              "range",
              "milestones",
              "off"
            ]
          }
        ]
      }
    },
    "timezone": {
      "type": "string",
      "maxLength": 100
    },
    "enabled": {
      "type": "boolean"
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.link

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_link).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.link","input":<input-object matching schema>}

CLI: indielogs call sources.link '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "repository": {
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "installation_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "repository_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.github.configure

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_github_configure).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.github.configure","input":<input-object matching schema>}

CLI: indielogs call sources.github.configure '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "branch": {
      "type": "string",
      "maxLength": 200
    },
    "excluded_paths": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 300
      }
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.github.install

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.github.install","input":<input-object matching schema>}

CLI: indielogs call sources.github.install '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# sources.github.repositories

Access: Bearer token required. Additional credential or scope: sources:read. MCP allowed: yes (op_sources_github_repositories).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.github.repositories","input":<input-object matching schema>}

CLI: indielogs call sources.github.repositories '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": {}
}

```

# sources.github.unlink

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_github_unlink).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.github.unlink","input":<input-object matching schema>}

CLI: indielogs call sources.github.unlink '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.capture

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_capture).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.capture","input":<input-object matching schema>}

CLI: indielogs call sources.capture '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "register_only": {
      "type": "boolean"
    }
  },
  "required": [
    "project_id",
    "url"
  ],
  "additionalProperties": {}
}

```

# sources.revenue-settings

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_revenue_settings).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.revenue-settings","input":<input-object matching schema>}

CLI: indielogs call sources.revenue-settings '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "display": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "string",
          "enum": [
            "exact",
            "range",
            "milestones",
            "off"
          ]
        }
      ]
    }
  },
  "required": [
    "project_id",
    "display"
  ],
  "additionalProperties": {}
}

```

# sources.revenue-status

Access: Bearer token required. Additional credential or scope: sources:read. MCP allowed: yes (op_sources_revenue_status).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.revenue-status","input":<input-object matching schema>}

CLI: indielogs call sources.revenue-status '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.revenue-disconnect

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_revenue_disconnect).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.revenue-disconnect","input":<input-object matching schema>}

CLI: indielogs call sources.revenue-disconnect '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.revenue-refresh

Access: Bearer token required. Additional credential or scope: sources:write. MCP allowed: yes (op_sources_revenue_refresh).

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.revenue-refresh","input":<input-object matching schema>}

CLI: indielogs call sources.revenue-refresh '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": {}
}

```

# sources.revenue-oauth-start

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.revenue-oauth-start","input":<input-object matching schema>}

CLI: indielogs call sources.revenue-oauth-start '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "mode": {
      "type": "string",
      "enum": [
        "test",
        "live"
      ]
    }
  },
  "required": [
    "project_id",
    "mode"
  ],
  "additionalProperties": false
}

```

# sources.revenue-connect

Access: Signed-in browser session required. Additional credential or scope: —. MCP allowed: no.

HTTP: POST /api/v2/execute. Replace the placeholder input below with an object matching the input JSON Schema; this example is not a runnable request.

{"version":1,"operation":"sources.revenue-connect","input":<input-object matching schema>}

CLI: indielogs call sources.revenue-connect '<input-json>' (command shape only; the placeholder is not a valid sample input).

Input JSON Schema (generated from the shared Zod input schema). JSON Schema describes representable structure; runtime refinements and transforms remain enforced by the canonical parser and may not be fully represented here.

```json

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "api_key": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "project_id",
    "api_key"
  ],
  "additionalProperties": {}
}

```