---
title: "Running P&L series"
method: POST
path: "/pnl/timeseries"
tags: ["P&L"]
---

# Running P&L series

`POST /pnl/timeseries`

The running P&L: the same waterfall bucketed by day, week, bi-weekly or month. Buckets are summed from TikTok's daily rows, so any cadence reconciles to Seller Center exactly.

## Request body

- PnlTimeseriesRequest — POST /pnl/timeseries request body — the running P&L series.
  - `start_date` string, date, nullable — Inclusive window start (YYYY-MM-DD).
  - `end_date` string, date, nullable — Inclusive window end (YYYY-MM-DD).
  - `cadence` 'day' | 'week' | 'biweekly' | 'month' — Bucket size. Buckets are summed from TikTok's own daily rows, so they reconcile to Seller Center exactly. Week and bi-weekly anchor on Monday.

## Response `200`

Successful Response

- PnlTimeseriesResponse — Running P&L bucketed to the requested cadence.
  - `shop_id` integer, required
  - `seller_id` string, required
  - `currency` string, required
  - `cadence` string, required
  - `series` PnlTimeseriesPoint[], required
    - `gross_sales` number, required
    - `refunds` number, required
    - `referral_fee` number, required
    - `affiliate` number, required — Affiliate commission, incl. shop-ads commission.
    - `gmv_max` number, required — GMV Max ad cost. Reliable at shop x day only — TikTok ships the per-order column empty, so per-SKU allocation needs GMV Max campaign data instead.
    - `campaigns` number, required
    - `managed_services` number, required
    - `shipping_and_warehousing_cost` number, required
    - `others` number, required
    - `net_earnings` number, required — TikTok's own bottom line for the window.
    - `period_start` string, required
  - `data_status` PnlDataStatus, required — Freshness and reachability of this shop's P&L data. ``state`` distinguishes "no sales" from "we cannot read the finance export": ``no_permission`` means the shop's Seller Center account lacks finance-tab access and the fix is customer-side, not a retry.
    - `state` string, required — Latest export-run status: never_run | pending | parsed | empty | failed | no_permission.
    - `last_synced_at` string, nullable — ISO timestamp of the newest successfully parsed run.
    - `last_window` PnlDateWindow — The date window an export run requested.
      - `start_date` string, nullable
      - `end_date` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) · [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/reacherapp/reacher-data-api/revisions/5eefff009b5b/schema)
