# External API: What's Changed (August – October 2026)

**URL:** <https://forum.api.combocurve.com/t/external-api-whats-changed-august-october-2026/486>\
**Category:** Uncategorized\
**Created:** [October 29, 2026, 5:30pm UTC](https://forum.api.combocurve.com/t/external-api-whats-changed-august-october-2026/486 "2026-10-29T17:30:06Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Danny\_Cooney](https://yyz1.discourse-cdn.com/flex035/user_avatar/forum.api.combocurve.com/danny_cooney/32/256_2.png) [@Danny\_Cooney](https://forum.api.combocurve.com/u/Danny_Cooney)\
**Post date:** [October 29, 2026, 5:30pm UTC](https://forum.api.combocurve.com/t/external-api-whats-changed-august-october-2026/486/1 "2026-10-29T17:30:06Z")

</div>

# External API: What's Changed (August – October 2026)

A summary of External API changes released through v47.2 (26 October 2026), covering the last three months (since late July) that affect client integrations. Changes are grouped by endpoint family. Internal fixes, performance work and infrastructure changes that don't alter requests or responses are not listed.

**Contents**

- Type Curves (V2 and V1 deprecation)
- Scenarios
- Forecasts
- Economics: Models and Reports
- Map Layers (Shapefiles) and Formations
- Embedded Lookup Tables
- Wells and Directional Surveys
- Production Data
- Action items

## Type Curves

### V1 Type Curves: deprecated, sunset 7 November 2026

The `/v1/projects/{projectId}/type-curves` routes now return `Deprecation` and `Sunset` response headers.

- **Sunset date:** Saturday, 7 November 2026. V1 stops responding on this date.
- Read these headers in your client to detect that you are still calling V1.

### V2 Type Curves: new, opt-in pre-release

A new `/v2/projects/{projectId}/type-curves` surface is available in pre-release. Until general availability on 7 November 2026 it responds only to tenants enrolled in the pre-release, and returns `404 Not Found` for everyone else. See the Type Curve 2.0 migration guide for the V1 to V2 field and route mapping.

| Resource | Endpoints | Notes |
| --- | --- | --- |
| Type curves | `GET`, `HEAD /v2/projects/{projectId}/type-curves`  
`GET /v2/projects/{projectId}/type-curves/{id}` | List and fetch by id. Required properties are listed first in the definitions. |
| Type curves (write) | `POST`, `PATCH /v2/projects/{projectId}/type-curves`  
`POST`, `PATCH /v2/projects/{projectId}/type-curves/batch`  
`DELETE /v2/projects/{projectId}/type-curves` and `DELETE .../{id}` | Single and batch create and update, plus delete. |
| Fits | `GET /v2/projects/{projectId}/type-curves/{id}/fits`  
`PUT /v2/projects/{projectId}/type-curves/{id}/fits` | `PUT` writes fit segments. |
| Volumes | `GET /v2/projects/{projectId}/type-curves/{id}/volumes` | Type curve volumes. |
| Wells | `GET`, `HEAD /v2/projects/{projectId}/type-curves/{id}/wells`  
`GET .../wells/head` | Wells in the type curve. |
| Normalization | `GET`, `PUT /v2/projects/{projectId}/type-curves/{id}/normalization` | Read and write normalization. |
| Lookup tables | `GET`, `HEAD`, `POST /v2/projects/{projectId}/type-curves/lookup-tables`  
`POST`, `PUT .../lookup-tables/batch`  
`GET`, `PUT`, `DELETE .../lookup-tables/{id}` | Full lookup table management. |

Also in V2:

- **Batch writes** (`POST` and `PATCH .../type-curves/batch`) now report each record's outcome. A record that fails for any reason other than a duplicate name is reported on its own, instead of the failure hiding which records were saved.
- **`econFields`** are removed from the V2 type curve schema, because the Economics tab no longer exists in Type Curve 2.0.
- **Normalization** now applies to all streams.

## Scenarios

### Run scenario economics (new)

| Endpoint | Description |
| --- | --- |
| `POST /v1/projects/{projectId}/scenarios/{scenarioId}/run` | Start an economics run for a scenario. Returns a job id. |
| `GET /v1/projects/{projectId}/scenarios/{scenarioId}/run/{jobId}` | Check the status of a run. |

`scenarioWellAssignmentIds` is not accepted in the run request.

### Scenario assignments (new)

| Endpoint | Description |
| --- | --- |
| `GET`, `PUT`, `DELETE /v1/projects/{projectId}/scenarios/{scenarioId}/assignments/models` | Read, set and remove model assignments on a scenario. |
| `PUT`, `DELETE /v1/projects/{projectId}/scenarios/{scenarioId}/assignments/econ-models` | Set and remove econ-model assignments. (`GET` on this path already existed.) |
| `GET /v1/projects/{projectId}/scenarios/{scenarioId}/well-assignments/incrementals` | Read incrementals on scenario well assignments, addressed by `incrementalIndex`. |

- The model assignments `PUT` accepts an optional `?addWellsToForecast` query parameter.
- Scenario qualifier upsert and delete endpoints were fixed.

### Combos

- **New optional field `facilityNetworkName`** on combo upsert and read: the name of the facility network assigned to the combo, scoped to the scenario. Omit it or leave it blank for no network. Upserts that set it are rejected for tenants without facility networks enabled.

## Forecasts

### Forecast wells (new)

- `GET`, `HEAD /v1/projects/{projectId}/forecasts/{id}/wells`
- `GET /v1/projects/{projectId}/forecasts/{id}/wells/head`

### Forecast outputs

- **New field `slopeValue`** on forecast output segments: the actual rate change per day (BBL/D/D). Populated for linear segments only.
- **`slope` clarified:** it is the sign of the slope (-1 declining, 0 flat, 1 increasing). Use `slopeValue` for the magnitude.
- **Type curve fields** (`typeCurve`, `typeCurveApplySetting`) are returned only while a forecast's segments still come from the applied type curve. After a manual edit they are omitted or `null`.

### Forecast volumes

- Custom streams are now supported for parametric forecasts.

## Economics

### Econ report settings (new)

| Endpoint | Description |
| --- | --- |
| `GET`, `HEAD /v1/econ-report-settings` | List report settings. |
| `GET /v1/econ-report-settings/{id}` | Fetch one. |
| `POST`, `PUT`, `PATCH /v1/econ-report-settings` | Create and update. |
| `DELETE /v1/econ-report-settings/{id}` | Delete. |

### Expenses models

- **Custom streams:** expenses accept custom stream rows. Only `$/Unit` (`dollarPerUnit`) is supported as the value unit.
- **`volumeThreshold`:** a new row criterion on expenses for tiered ("blocked") volume pricing. Each row's value is the lower bound of a tier, the last row is unbounded, and every tier below the well's volume contributes to an average unit cost. Valid on expenses only.
- **Shrinkage:** BOE and Total Fluid processing expenses now accept an optional `shrinkageCondition` (defaults to unshrunk). NGL and Drip Condensate processing reject it.
- **Operations models:** the `curtailment` rows accept a new `category` value, `facility_capacity`. It applies at the facility level and restricts `key` to `oil`, `gas` or `water`, `criteria` to `entire_well_life`, `dates` or `seasonal`, and `unit` to `bbl_per_day` or `mcf_per_day`. Rows with this category are rejected for tenants without facility constraints enabled.
- **Pricing models:** the Break Even row has a new optional `category`, `bfit` (default) or `afit`. Models saved without one are returned as `bfit`. AFIT is calculated only when General Options has Income Tax turned on.
- **BOE processing:** the doubled-up nesting of `rows` on the BOE processing field is fixed. Review any payload that worked around it.

### Econ results

- **One-liners:** added the missing company custom stream columns (Well Head Volume, Sales Volume, WI, NRI, First Reversion WI and NRI, Shrinkage, Price, Differential), and `afitOilBreakeven` and `afitGasBreakeven`, which are blank unless the pricing Break Even category is `afit` and Income Tax is on.
- **Production taxes:** flat (`entire_well_life`) periods are stored as `Flat`. Sending `Flat`, `\['Flat'\]` or omitting `period` all produce the same result.
- **Monthly econ results:** columns now match the current economics output, including company and project custom stream price and revenue columns. The date column values in the response are now documented as `date-time` instead of `date`.

## Map Layers (Shapefiles) and Formations

### Map layers (shapefiles) (new)

Company-wide routes at `/v1/shapefiles`, and the same set scoped to a project at `/v1/projects/{projectId}/shapefiles`. Heatmap layers are not available through the API.

| Endpoint | Description |
| --- | --- |
| `GET`, `HEAD /v1/shapefiles` | List the company's map layers (company layers and every project's). Each record lists every project the layer belongs to. `HEAD` returns the count in `X-Query-Count`. |
| `POST /v1/shapefiles` | Create a layer from a GeoJSON FeatureCollection. Asynchronous: returns `202` with a job id. A name already in use returns `409` with the existing layer's id as `conflictingId`. |
| `PATCH /v1/shapefiles` | Update layer metadata (`name`, `description`, `color`, `scope`, `projectIds`). This is how a layer is shared with more projects or removed from some. One record per layer; results are returned for each. |
| `GET /v1/shapefiles/{id}` | Fetch a layer's metadata. |
| `GET /v1/shapefiles/{id}/features` | Read a layer's features as GeoJSON (WGS84), paginated, in original order. |
| `DELETE /v1/shapefiles/{id}` | Delete a layer everywhere, asynchronously. Returns `202` with a job id. |
| `GET /v1/shapefiles/jobs/{jobId}` | Status of an upload, create or delete job. A successful upload's result has the new layer's id. |

**Uploading a shapefile zip** is a three-step flow:

1. `POST /v1/shapefiles/uploads` returns a signed URL, valid for 30 minutes.
2. `PUT` the zip to that URL. It must hold one shapefile (`.shp`, `.shx`, `.dbf`, optionally `.prj`) and be at most 260 MB.
3. `POST /v1/shapefiles/uploads/{uploadId}` imports it within 24 hours. An upload can be imported once; repeating the request returns `409` with the original `jobId`. Poll the `jobId` it returns.

The project routes (`/v1/projects/{projectId}/shapefiles`) offer list, create, upload, features, fetch and delete. Metadata updates (`PATCH`) are only available on the company route.

### Formations (new)

Company-wide routes at `/v1/formations`, and project-scoped at `/v1/projects/{projectId}/formations`.

| Endpoint | Description |
| --- | --- |
| `GET`, `HEAD /v1/formations` | List formation summaries for the company. Each record carries `scope` and `projectId`. Points are not included. |
| `PUT /v1/formations` | Create or replace company formations by name, asynchronously. |
| `PATCH /v1/formations` | Update `name`, `color`, `enabled`, `maxDepth` and `maxThickness`. Scope cannot be changed. |
| `GET /v1/formations/{id}` | Fetch a formation summary. |
| `GET /v1/formations/{id}/points` | Read a formation's points. |
| `DELETE /v1/formations/{id}` | Delete a company formation. Project formations are deleted from the project route. |
| `GET /v1/formations/jobs/{jobId}` | Status of an import started with `PUT`: what was written, overlaps found, and any rows skipped. |

## Embedded Lookup Tables

### Embedded lookup tables (new, read-only)

| Endpoint | Description |
| --- | --- |
| `GET`, `HEAD /v1/embedded-lookup-tables` | List company embedded lookup tables. `HEAD` returns the count. |
| `GET /v1/embedded-lookup-tables/{id}` | Fetch one company embedded lookup table. |
| `GET`, `HEAD /v1/projects/{projectId}/embedded-lookup-tables` | List a project's embedded lookup tables. |
| `GET /v1/projects/{projectId}/embedded-lookup-tables/{id}` | Fetch one project embedded lookup table. |

- Responses include `lookup_by` and the custom stream key, and each row carries a `rowNumber`.
- Filter by `name`, `type`, `createdAt` and `updatedAt`. Without a `type` filter, the list includes every type the tenant can use.

## Wells and Directional Surveys

### Directional surveys

- **New** `POST /v1/directional-surveys/batch`: upsert several directional surveys in one request. Returns `207 Multi-Status` with the outcome for each well.

### Wells

- **New wellbore fields** are now exposed: `heelTrueVerticalDepth`, `midpointTrueVerticalDepth`, `toeTrueVerticalDepth` (FT), plus `midpointLatitude` and `midpointLongitude`.

## Production Data

### Production comments

- **Writes** accept `chosenID` plus `dataSource` instead of `well`. `well` is required unless both are provided, and `dataSource` must be the same for every record in a request. Both fields are filterable and returned on reads.
- `updatedAt` is now filterable on the production comments endpoints (`/v1/production-comments` and the project-scoped `/v1/projects/{projectId}/production-comments`).

### Daily and monthly production

- Production data can no longer be created against a facility id. Only real wells are accepted.

## Action items

1. **Moving off V1 Type Curves?** The V1 routes sunset on **7 November 2026**. Start testing against `/v2` if your tenant is enrolled.
2. **Parsing econ monthly results?** Handle the date column format and the new custom stream columns.
3. **Sending expenses with BOE processing rows?** Check the corrected `rows` nesting.
