# Teachers Pay Teachers API and MCP server

> Teachers Pay Teachers has no public API for sellers (checked 11 Oct 2026). Listings, prices, sales, Q&A and promotions are managed only in the seller pages of the website.

Marketplace where teachers sell and buy classroom resources: digital downloads, bundles, Google Drive resources, videos and Easel activities.

## What is the Teachers Pay Teachers API?

Cotlet's Teachers Pay Teachers API exposes 14 endpoints for your own Teachers Pay Teachers account: list products, get product, get store stats, get product stats, list sales, get search keywords, list buyer questions, create product, update product, set product status, upload revised file, answer buyer question, schedule sale and send Note to Followers. The list_products endpoint returns your product listings with title, type, price, status and custom category. Each endpoint takes simple JSON inputs like product_id, from or to and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Courses & training](https://cotlet.dev/integrations/category/courses-training)
- **Endpoints:** 14 (7 read, 7 write)
- **Updated:** 2026-10-11

Teachers Pay Teachers has no public API for sellers (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for Teachers Pay Teachers with 14 endpoints (7 read, 7 write): your AI agent signs in as you and does the work.

## Does Teachers Pay Teachers have an official API?

Teachers Pay Teachers has no public API for sellers (checked 11 Oct 2026). Listings, prices, sales, Q&A and promotions are managed only in the seller pages of the website.

| Task | Teachers Pay Teachers official | Cotlet |
|---|---|---|
| List your products and their prices | No | Yes |
| Create a product listing | No | Yes |
| Change price or additional license price | No | Yes |
| Read earnings and units sold | No | Yes |
| Read sales details line by line | No | Yes |
| Answer buyer questions | No | Yes |
| Throw a sale | No | Yes |
| Send a Note to Followers | No | Yes |

Sources: [TPT Help: How do I add a product to my TPT store?](https://help.teacherspayteachers.com/hc/en-us/articles/360042864711-How-do-I-add-a-product-to-my-TPT-store), [TPT Help: Product Insights Report vs Seller Dashboard](https://help.teacherspayteachers.com/hc/en-us/articles/43226030198804-How-is-the-Product-Insights-Report-different-from-the-Seller-Dashboard), [TPT Help: How do I respond to Buyer questions?](https://help.teacherspayteachers.com/hc/en-us/articles/31699839237780-How-do-I-respond-to-Buyer-questions), [TPT Help: How do I throw a sale?](https://help.teacherspayteachers.com/hc/en-us/articles/360042885551-How-do-I-throw-a-sale), [TPT Help: What is the Search Analytics feature?](https://help.teacherspayteachers.com/hc/en-us/articles/47576021987348-What-is-the-Search-Analytics-feature-and-how-does-it-work), [TPT Help: Exclusive Seller FAQs for New Sellers and Basic Sellers](https://help.teacherspayteachers.com/hc/en-us/articles/53904743536276-Exclusive-Seller-FAQs-for-New-Sellers-and-Basic-Sellers)

## For AI agents

```text
Teachers Pay Teachers has no public API for sellers (checked 11 Oct 2026). Listings, prices, sales, Q&A and promotions are managed only in the seller pages of the website.
Cotlet provides a hosted MCP server and REST API for Teachers Pay Teachers: 14 tools (7 read, 7 write).
Access       Request access at https://cotlet.dev/app/signup?app=teachers-pay-teachers; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/teachers-pay-teachers
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_products, get_product, get_store_stats, get_product_stats, list_sales, get_search_keywords, list_buyer_questions, create_product, update_product, set_product_status, upload_revised_file, answer_buyer_question, schedule_sale, send_note_to_followers
Confirm      create_product, update_product, set_product_status, upload_revised_file, answer_buyer_question, schedule_sale, send_note_to_followers (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/teachers-pay-teachers-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=teachers-pay-teachers (Teachers Pay Teachers is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to Teachers Pay Teachers once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted Teachers Pay Teachers server that someone else maintains, including non-developers. Developers who prefer to run and fix code on their own computer can use an open-source Teachers Pay Teachers MCP server instead.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to Teachers Pay Teachers in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following Teachers Pay Teachers's terms; Cotlet is not affiliated with Teachers Pay Teachers.
```

## What can an AI agent do in Teachers Pay Teachers?

Cotlet is best for Teachers Pay Teachers sellers who want an AI agent to answer buyer questions, schedule sales, update prices and report sales without running or fixing a server.

- **[Answer buyer questions](https://cotlet.dev/integrations/teachers-pay-teachers-api-mcp-server/answer-buyer-questions)** (runs: daily): "Draft answers to every unanswered question in my TPT Q&A from what each listing really contains, flag anything I have to decide myself, and post nothing until I approve." → `list_buyer_questions`, `get_product`, `answer_buyer_question`
- **Weekly store sales report** (runs: weekly): "Every Monday, tell me earnings, units sold and my top 5 products for last week, first-time versus repeat buyers." → `get_store_stats`, `list_products`, `get_product_stats`
- **[Throw a store sale](https://cotlet.dev/integrations/teachers-pay-teachers-api-mcp-server/throw-a-sale)** (runs: weekly): "Put every active resource in my Fractions category on 20% off from Friday to Sunday and draft a Note to Followers that announces it on Friday." → `list_products`, `schedule_sale`, `send_note_to_followers`
- **[Bulk update product prices](https://cotlet.dev/integrations/teachers-pay-teachers-api-mcp-server/bulk-update-prices)**: "Raise the price of every active bundle under $10 by $1, keep each additional license discount at the same percentage, and show me the full list before you change anything." → `list_products`, `get_product`, `update_product`
- **[Improve titles with search keywords](https://cotlet.dev/integrations/teachers-pay-teachers-api-mcp-server/improve-titles-with-search-keywords)**: "Look at my TPT Search Analytics for the last quarter, find listings whose titles miss the keywords buyers use to reach them, and suggest new titles before changing anything." → `get_search_keywords`, `list_products`, `get_product`, `update_product`
- **Upload a new listing from a file**: "Upload fall-centers.zip as a new $6 listing for grades 1 and 2, inactive for now." → `create_product`

## Can Teachers Pay Teachers automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a Teachers Pay Teachers connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to answer buyer questions, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/teachers-pay-teachers/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/teachers-pay-teachers/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/teachers-pay-teachers/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/teachers-pay-teachers/{tool} with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 14 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 403 until the account has an API key with access to Teachers Pay Teachers.

### list_products

Your product listings with title, type, price, status and custom category. Access: read. REST: `POST /api/v1/teachers-pay-teachers/list_products`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | active, inactive or all. Default: all. |
| `type` | enum | no | digital_download, bundle, video, google_resource or all. Default: all. |
| `custom_category` | string | no | Only products in this store custom category. |
| `limit` | integer | no | 1 to 100. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

Lists your listings with title, type, price, status and custom category. Filter by status, type or custom category to find a group of products. Pages hold up to 100 products; pass next_cursor back as cursor for the next page.

Example response:

```json
{
  "products": [
    {
      "product_id": "11204567",
      "title": "Fraction Task Cards, Grades 3-4",
      "type": "digital_download",
      "price_cents": 600,
      "status": "active",
      "custom_category": "Fractions"
    },
    {
      "product_id": "9873310",
      "title": "Fractions Bundle",
      "type": "bundle",
      "price_cents": 900,
      "status": "active",
      "custom_category": "Fractions"
    }
  ],
  "next_cursor": null
}
```

### get_product

Full listing: title, description, price, additional license price, grades, subjects, tags, formats and files. Access: read. REST: `POST /api/v1/teachers-pay-teachers/get_product`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |

Returns one listing in full: description, price, additional license price, grades, subjects, tags, formats and files. Use it before answering a buyer question or rewriting a title, so your agent works from the real listing.

Example response:

```json
{
  "product_id": "11204567",
  "title": "Fraction Task Cards, Grades 3-4",
  "description": "20 printable task cards on comparing and adding fractions, with answer keys.",
  "price_cents": 600,
  "additional_license_price_cents": 300,
  "grades": [
    "3rd",
    "4th"
  ],
  "subjects": [
    "Fractions"
  ],
  "tags": [
    "Task Cards"
  ],
  "formats": [
    "PDF"
  ],
  "status": "active"
}
```

### get_store_stats

Seller Dashboard totals: earnings, units sold, carts, unique buyers, views and conversions. Access: read. REST: `POST /api/v1/teachers-pay-teachers/get_store_stats`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day of the period. |
| `to` | date | yes | Last day of the period. |
| `buyer_type` | enum | no | all, first_time or repeat. Default: all. |
| `product_ids` | string[] | no | Only these products. Default: whole store. |

Returns the Seller Dashboard totals for a period: earnings, units sold, carts, unique buyers, views and conversions. Set buyer_type to compare first-time and repeat buyers, or product_ids to look at part of the store. Earnings are in US cents.

Example response:

```json
{
  "from": "2026-10-05",
  "to": "2026-10-11",
  "buyer_type": "all",
  "earnings_cents": 41235,
  "units_sold": 74,
  "carts": 91,
  "unique_buyers": 58,
  "views": 3120,
  "conversion": 0.024
}
```

### get_product_stats

Per product: earnings, units sold, views, conversion, Wish Listed and Saved for Later. Access: read. REST: `POST /api/v1/teachers-pay-teachers/get_product_stats`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `from` | date | yes | First day of the period. |
| `to` | date | yes | Last day of the period. |

Returns the numbers of one product for a period: earnings, units sold, views, conversion, Wish Listed and Saved for Later. Call it for each product from list_products to rank them.

Example response:

```json
{
  "product_id": "11204567",
  "from": "2026-10-05",
  "to": "2026-10-11",
  "earnings_cents": 7200,
  "units_sold": 12,
  "views": 410,
  "conversion": 0.029,
  "wish_listed": 5,
  "saved_for_later": 9
}
```

### list_sales

Sales Details from your Sales Reports, one line per item sold, with earnings and sales tax. Access: read. REST: `POST /api/v1/teachers-pay-teachers/list_sales`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day of the period. |
| `to` | date | yes | Last day of the period. |
| `product_id` | string | no | Only sales of this product. |
| `cursor` | string | no | Next page cursor from the previous call. |

Returns Sales Details from your Sales Reports, one line per item sold, with earnings and sales tax. Filter by product to see the sales of one listing. Pass next_cursor back as cursor for the next page.

Example response:

```json
{
  "sales": [
    {
      "date": "2026-10-09",
      "product_id": "11204567",
      "title": "Fraction Task Cards, Grades 3-4",
      "earnings_cents": 510,
      "sales_tax_cents": 0
    },
    {
      "date": "2026-10-09",
      "product_id": "9873310",
      "title": "Fractions Bundle",
      "earnings_cents": 765,
      "sales_tax_cents": 0
    }
  ],
  "next_cursor": null
}
```

### get_search_keywords

Search Analytics: TPT search keywords that led buyers to your products, with visits, conversions and earnings. Access: read. REST: `POST /api/v1/teachers-pay-teachers/get_search_keywords`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day of the period, 1 Jan 2025 or later. |
| `to` | date | yes | Last day of the period. |
| `product_id` | string | no | One product only. Default: whole store. |

Returns the TPT search keywords that led buyers to your products, with visits, conversions and earnings. Search Analytics starts on 1 Jan 2025. Pass product_id to see the keywords of one listing.

Example response:

```json
{
  "keywords": [
    {
      "keyword": "fraction task cards",
      "visits": 214,
      "conversions": 9,
      "earnings_cents": 5400
    },
    {
      "keyword": "fractions 4th grade",
      "visits": 167,
      "conversions": 6,
      "earnings_cents": 3600
    }
  ]
}
```

### list_buyer_questions

Questions from the Q&A section of your store, newest first, with product and any answer. Access: read. REST: `POST /api/v1/teachers-pay-teachers/list_buyer_questions`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `unanswered_only` | boolean | no | Skip questions you already answered. Default: false. |
| `limit` | integer | no | 1 to 100. Default: 50. |

Lists questions from the Q&A section of your store, newest first, each with its product and any answer you already gave. Set unanswered_only to see what needs a reply. Pass question_id to answer_buyer_question.

Example response:

```json
{
  "questions": [
    {
      "question_id": "q_5821",
      "product_id": "11204567",
      "question": "Does this include answer keys?",
      "asked_at": "2026-10-10T14:20:00Z",
      "answer": null
    }
  ]
}
```

### create_product

New Digital Download listing from a file. Inactive by default; an active listing is live for buyers right away. Access: write, asks the user first. REST: `POST /api/v1/teachers-pay-teachers/create_product`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `title` | string | yes | Product title. |
| `description` | string | yes | Product description. |
| `file_url` | string | yes | URL of the PDF or ZIP buyers download. |
| `price_cents` | integer | yes | Price in US cents, e.g. 600 for $6. 0 for a free resource. |
| `grades` | string[] | yes | TPT grade levels, e.g. "1st", "2nd". |
| `subjects` | string[] | yes | TPT subjects, e.g. "Fractions". |
| `tags` | string[] | no | Resource type tags, e.g. "Centers". |
| `preview_url` | string | no | URL of a PDF preview. |
| `active` | boolean | no | Make Listing Active now. Default: false. |

Creates a Digital Download listing from the URL of a PDF or ZIP. The listing is inactive unless active is true, and an active listing is live for buyers right away. Price is in US cents. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "product_id": "11310482",
  "title": "Fall Math Centers, Grades 1-2",
  "status": "inactive",
  "price_cents": 600,
  "grades": [
    "1st",
    "2nd"
  ],
  "subjects": [
    "Math"
  ]
}
```

### update_product

Change title, description, price, additional license price, grades, subjects or tags of a listing. Access: write, asks the user first. REST: `POST /api/v1/teachers-pay-teachers/update_product`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `fields` | object | yes | Any of title, description, price_cents, additional_license_price_cents, grades, subjects, tags. |

Changes the fields you pass and leaves the rest. Price changes show to buyers right away on an active listing. Price is in US cents. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "product_id": "11204567",
  "status": "updated",
  "changed": {
    "price_cents": {
      "from": 600,
      "to": 700
    }
  }
}
```

### set_product_status

Make a listing active or inactive. Past buyers keep their downloads. Access: write, asks the user first. REST: `POST /api/v1/teachers-pay-teachers/set_product_status`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `active` | boolean | yes | true to sell it, false to hide it. |

Makes a listing active (for sale) or inactive (hidden). Past buyers keep their downloads. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "product_id": "11310482",
  "active": true,
  "status": "active"
}
```

### upload_revised_file

Replace the product file and optionally notify past buyers with a note on what changed. Access: write, asks the user first. REST: `POST /api/v1/teachers-pay-teachers/upload_revised_file`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `file_url` | string | yes | URL of the new PDF or ZIP. |
| `notify_buyers` | boolean | no | Notify Buyers on their My Purchases page. Default: false. |
| `change_note` | string | no | What changed, shown to buyers when notified. |

Replaces the file buyers download. With notify_buyers set, past buyers are notified on their My Purchases page, and change_note tells them what changed. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "product_id": "11204567",
  "status": "file_replaced",
  "buyers_notified": true
}
```

### answer_buyer_question

Post a public answer to a question on your product page. Access: write, asks the user first. REST: `POST /api/v1/teachers-pay-teachers/answer_buyer_question`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `question_id` | string | yes | Question ID from list_buyer_questions. |
| `answer` | string | yes | Answer text, shown publicly under your store name. |

Posts an answer to one buyer question. The answer is public and appears under your store name. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "question_id": "q_5821",
  "status": "published"
}
```

### schedule_sale

Throw a sale on chosen products or your whole store for set dates. Access: write, asks the user first. REST: `POST /api/v1/teachers-pay-teachers/schedule_sale`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `discount` | enum | yes | 5, 10, 15 or 20 (percent off). |
| `start_date` | date | yes | First day of the sale. |
| `end_date` | date | yes | Last day of the sale. |
| `product_ids` | string[] | no | Products on sale. Empty: whole store. |

Schedules a sale of 5, 10, 15 or 20 percent off between a start and an end date. Leave product_ids empty to put the whole store on sale. Buyers see the lower prices during the sale. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "sale_id": "sale_48213",
  "status": "scheduled",
  "discount": 20,
  "start_date": "2026-10-16",
  "end_date": "2026-10-18",
  "products": 3
}
```

### send_note_to_followers

Weekly Note to Followers about new products or promotions, sent now or on a set date. Access: write, asks the user first. REST: `POST /api/v1/teachers-pay-teachers/send_note_to_followers`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `body` | string | yes | Note text. Images by URL. |
| `send_on` | date | no | Send date. Default: now. |

Sends a Note to Followers about new products or promotions, now or on the date you set. Images go in the body by URL. The note reaches everyone who follows your store. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "note_id": "note_3307",
  "status": "sent",
  "sent_on": "2026-10-12"
}
```

## How do I connect Teachers Pay Teachers to Claude Code, Codex or Cursor?

Connecting Teachers Pay Teachers takes three steps: request access, sign in to Teachers Pay Teachers once, then add one MCP server or call the REST API with the same key.

### Connect Teachers Pay Teachers to your agent.

1. **Create an account** Sign up and add Teachers Pay Teachers in the console. Your API key is there too.

2. **Sign in to Teachers Pay Teachers once** Open the connect page from the console and sign in to Teachers Pay Teachers the way you always do. We keep the session, never your password, and you can revoke it anytime.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the Teachers Pay Teachers tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
Draft answers to every unanswered question in my TPT Q&A from what each listing really contains, flag anything I have to decide myself, and post nothing until I approve.
```

### Call Teachers Pay Teachers from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is a POST endpoint at /api/v1/teachers-pay-teachers/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/teachers-pay-teachers/schedule_sale \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"discount":"20","start_date":"2026-10-16","end_date":"2026-10-18","product_ids":["11204567","11204582","9873310"]}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "sale_id": "sale_48213",
  "status": "scheduled",
  "discount": 20,
  "start_date": "2026-10-16",
  "end_date": "2026-10-18",
  "products": 3
}
```

## Why use Cotlet for Teachers Pay Teachers?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to Teachers Pay Teachers yourself. We keep only the session, encrypted with AES-256.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Pick read only, or read and write.
- Anything that reaches other people waits for your OK, unless you switch it off per tool.
- Revoke access in one click.

**Kept working for you**

- We test every integration daily.
- When Teachers Pay Teachers changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a Teachers Pay Teachers MCP server on GitHub?

Yes. A community MCP server exists on GitHub, maintained by one person. It drives the TPT seller form in a local Chrome window to upload listings, and you install and fix it yourself. It does not read sales or answer buyers. Cotlet hosts a server for the whole seller side and our team keeps it working.

|  | GitHub MCP server | Cotlet |
|---|---|---|
| Setup | Install Node.js and Chrome, keep a local folder of listing JSON files | Request access, sign in to TPT once, add one MCP server or API key |
| What it does | Uploads new listings as drafts or active | Listings, prices, sales reports, Q&A, sales and Notes to Followers |
| When TPT changes | Selectors break until you or the maintainer fix them | Our team tests it daily and fixes it for you; failed calls are free |
| Your TPT session | In a local Chrome window on your computer | Encrypted in an EU vault, limited to the actions you allow, revoked in one click |
| When the session expires | Sign in again in its Chrome window | We keep it alive; if TPT logs you out, your agent gets a link to sign in again |
| Where it runs | Your computer, one MCP client and one browser at a time | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Free, paid for with your time | Free 7-day trial with 5,000 credits, then credits per call |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when Teachers Pay Teachers changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want the session to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the Teachers Pay Teachers API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the Teachers Pay Teachers API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

| Size | Price | Credits / month | Per credit |
|---|---|---|---|
| Solo | $29/mo | 3,000 | about $0.0097 |
| Pro | $99/mo | 12,000 | about $0.0083 |
| Agency | $299/mo | 40,000 | $0.0075 |

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own Teachers Pay Teachers account.

- **Company details:** The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. [Terms](https://cotlet.dev/terms)
- **Your session:** You sign in to Teachers Pay Teachers yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a Teachers Pay Teachers tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect Teachers Pay Teachers in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **Teachers Pay Teachers's terms:** You use your own Teachers Pay Teachers account and stay responsible for following Teachers Pay Teachers's terms. Cotlet is independent and not affiliated with Teachers Pay Teachers. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Request access and pick Teachers Pay Teachers. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to Teachers Pay Teachers once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is a hosted server safe? My Teachers Pay Teachers session would leave my computer.**

Cotlet keeps your Teachers Pay Teachers session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

**Can my agent post or send messages in Teachers Pay Teachers without asking me?**

No. Every call to create_product, update_product, set_product_status, upload_revised_file, answer_buyer_question, schedule_sale or send_note_to_followers waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals.

**Can I use the Teachers Pay Teachers API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/teachers-pay-teachers/{tool} from the HTTP Request node.
