---
title: "Upload temporary district plan"
method: POST
path: "/upload/temporary"
---

# Upload temporary district plan

`POST /upload/temporary`

Upload a GeoJSON district plan for temporary scoring. Results will automatically
disappear within a week. Same format as regular upload endpoint.

## Request body

- GeoJSONPlan
  - `type` 'FeatureCollection', required — Must be "FeatureCollection"
  - `description` string — Short description of the plan that will appear as the top-most header on the plan page
  - `model_version` string — Predictive model version to use. If omitted, the most recent available version is used.
  - `library_metadata` LibraryMetadata — Additional metadata about the plan, particularly for library/historical plans. The following properties are displayed specially in the plan UI, but other properties are also allowed.
    - `authoritative_link` string, uri — URL to the authoritative source for this plan (e.g., state legislature website)
    - `predecessor_link` string, uri — URL to the preceding enacted plan that this plan replaces or succeeds
    - `shapefile_file` string, uri — URL to download the plan as a shapefile
    - `blockassign_file` string, uri — URL to download the block assignment file for this plan
    - `notes` string — Explanatory notes about the plan, its history, or other relevant context
  - `features` DistrictFeature[], required — Array of district polygons
    - `type` 'Feature', required
    - `geometry` union, required
      - Polygon
        - `type` 'Polygon', required
        - `coordinates` array[], required
          - array[]
            - number[]
      - MultiPolygon
        - `type` 'MultiPolygon', required
        - `coordinates` array[], required
          - array[]
            - array[]
              - …
    - `properties` object, required
      - `Incumbent` 'R' | 'D' | 'O' — Incumbent party affiliation for more accurate predictions: - R: Republican incumbent - D: Democratic incumbent - O: Open seat (default)

## Response `200`

Temporary plan uploaded successfully

- UploadResponse
  - `index_url` string, uri, required — Machine-readable JSON representation of the plan being scored. The response follows the structure defined in the PlanIndex schema.
  - `plan_url` string, uri, required — Human-readable web page with graphs and maps for the plan

## Other responses

- `400` — Bad request - invalid GeoJSON or plan data
- `401` — Authentication required

## Changes

- **2025-12-03** `b70a9c260a66` — 5 info
  - added the new optional request property `library_metadata/authoritative_link`
  - added the new optional request property `library_metadata/blockassign_file`
  - added the new optional request property `library_metadata/notes`
  - added the new optional request property `library_metadata/predecessor_link`
  - …1 more
- **2025-11-13** `baf6158b0ed2` — 5 warning
  - removed the request property `library_metadata/authoritative_link`
  - removed the request property `library_metadata/blockassign_file`
  - removed the request property `library_metadata/notes`
  - removed the request property `library_metadata/predecessor_link`
  - …1 more

[Change history](https://skmtc.dev/planscore/apis/planscore-api/changes/upload/temporary/post.md)

---

[API](https://skmtc.dev/planscore/apis/planscore-api.md) · [All operations](https://skmtc.dev/planscore/apis/planscore-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/planscore/planscore-api/revisions/124d888b2d0d/schema)
