---
title: "Get send progress for a contract batch"
method: GET
path: "/contracts/batches/{batch_id}"
tags: ["Contracts"]
---

# Get send progress for a contract batch

`GET /contracts/batches/{batch_id}`

Progress for one batch of contracts: `total_count` / `sent_count` / `failed_count`, every envelope in the batch, and a `failures` list naming the creators whose delivery failed and why. Poll this after a batch is sent from the portal to watch it drain.

404 when the batch does not belong to this shop. Single-shop only.

## Path parameters

- `batch_id` string, uuid, required — Batch id (UUID).

## Response `200`

Successful Response

- BatchProgress
  - `batch_id` string, uuid, required
  - `status` 'queued' | 'sending' | 'completed' | 'partial_failure' | 'failed', required
  - `total_count` integer, required
  - `sent_count` integer, required
  - `failed_count` integer, required
  - `envelopes` ContractEnvelopeOut[]
    - `id` string, uuid, required
    - `batch_id` string, uuid, required
    - `campaign_id` integer, required
    - `campaign_name` string, required
    - `creator_id` integer, required
    - `creator_name` string, required
    - `creator_handle` string, required
    - `contract_title` string, required
    - `template_source` 'standard', required
    - `terms` ContractTerms, required
      - `campaign_type` 'retainer' | 'challenge' | 'leaderboard' | 'reimbursement', required
      - `brand_name` string, required
      - `brand_representative_name` string, required
      - `deliverables` integer, required
      - `posting_platform` 'TikTok' | 'Instagram' | 'YouTube' | 'TikTok+Instagram'
      - `posting_requirements` string
      - `posting_start_date` string, date, required
      - `effective_date` string, date, required
      - `expiry_date` string, date, required
      - `products` ContractProduct[]
        - `product_id` string, required
        - `product_name` string, nullable
      - `all_products` boolean
      - `require_video_link_email` boolean
      - `video_link_email` string, nullable
      - `commission_pct` number, nullable
      - `expenses_reimbursable` boolean
      - `revision_rounds` 0 | 1 | 2
      - `include_usage_rights` boolean
      - `usage_rights_months` integer
      - `usage_rights_duration_days` integer
      - `usage_rights_scope` 'organic_only' | 'organic_and_paid' | 'paid_only'
      - `usage_exclusivity_enabled` boolean
      - `usage_exclusivity_months` integer
      - `agreement_clause` string, nullable
      - `termination_notice_days` integer
      - `governing_law_jurisdiction` string
      - `reward` union, required
        - RetainerReward
          - `kind` 'retainer', required
          - `mode` 'fixed' | 'tiered', required
          - `payment_per_post` union
            - number
            - string
          - `tiers` RetainerTier[], nullable
            - `name` string, required
            - `retainer` union, required
              - …
            - `gmv_threshold` number, required
          - `gmv_bonus_tiers` GmvBonusTier[], nullable
            - `gmv_threshold` number, required
            - `bonus_amount` union, required
              - …
          - `recurring` boolean
          - `payment_schedule` 'one_time' | 'monthly'
          - `payment_due_days` integer
          - `minimum_gmv_floor` number, nullable
        - ChallengeReward
          - `kind` 'challenge', required
          - `metric_type` 'gmv' | 'views' | 'video_count' | 'gmv_videos' | 'live_gmv' | 'sessions' | 'sessions_and_live_gmv', required
          - `payment_tiers` ChallengePaymentTier[], required
            - `threshold` number, required
            - `compensation` union, required
              - …
            - `videos_required` integer, nullable
            - `sessions_required` integer, nullable
          - `minimum_gate` ChallengeGate
            - `metric` 'video_count' | 'gmv', required
            - `threshold` number, required
          - `gmv_floor` number, nullable
          - `videos_floor` integer, nullable
          - `live_gmv_floor` number, nullable
          - `sessions_floor` integer, nullable
          - `ranking_priority` 'gmv' | 'videos' | 'live_gmv' | 'sessions', nullable
          - `payment_due_days` integer
        - LeaderboardReward
          - `kind` 'leaderboard', required
          - `mode` 'rank' | 'tier', required
          - `contest_ranks` ContestRank[], nullable
            - `rank` integer, required
            - `reward` union, required
              - …
          - `tiers` LeaderboardTier[], nullable
            - `name` string, required
            - `bonus` union, required
              - …
            - `threshold` number, required
            - `videos_required` integer, nullable
            - `num_winners` integer, nullable
          - `random_winner_wheel` boolean
          - `scoring_mode` 'single' | 'weighted', nullable
          - `weighted_metrics` ContractWeightedMetric[], nullable
            - `metric_type` 'gmv' | 'avg_views_per_post' | 'views' | 'videos_posted' | 'units_sold' | 'live_gmv' | 'combined_gmv' | 'sessions', required
            - `weight` number, required
          - `metric_type` 'gmv' | 'views' | 'videos_posted' | 'gmv_videos' | 'live_gmv' | 'gmv_and_live_gmv' | 'videos_gmv_and_live_gmv', nullable
          - `gmv_floor` number, nullable
          - `videos_floor` integer, nullable
          - `live_gmv_floor` number, nullable
          - `sessions_floor` integer, nullable
          - `payment_due_days` integer
        - ReimbursementReward
          - `kind` 'reimbursement', required
          - `reimbursement_amount` number, required
          - `reimbursement_bonus` number, nullable
          - `minimum_star_rating` integer, nullable
          - `steps` ReimbursementStep[], required
            - `id` string, required
            - `label` string, required
            - `description` string, required
          - `payment_due_days` integer
    - `status` 'draft' | 'sent' | 'active' | 'expired' | 'voided' | 'delivery_failed', required
    - `brand_signed_at` string, date-time, nullable
    - `creator_signed_at` string, date-time, nullable
    - `effective_date` string, date, required
    - `expiry_date` string, date, required
    - `last_error` string, nullable
  - `failures` FailureItem[]
    - `creator_id` integer, required
    - `error_code` string, required
    - `error_message` string, required

## 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)
