---
title: "Create a source"
method: POST
path: "/v1/sources"
tags: ["Sources"]
---

# Create a source

`POST /v1/sources`

## Request

- Base URL: `https://sourcefinch.com`
- URL: `https://sourcefinch.com/v1/sources`
- Auth: HTTP bearer

The source's origin must be approved for the workspace. Version 1 of the recipe is recorded.

## Headers

- `Idempotency-Key` string
- `X-Request-Id` string
- `SourceFinch-Project` string, uuid

## Request body

- SourceCreate
  - `name` string, required
  - `url` string, uri, required
  - `recipe` Recipe, required
    - `schema` 'sourcefinch/recipe@1'
    - `mode` 'http' | 'browser'
    - `format` 'html' | 'json' | 'xml' | 'csv'
    - `items` string, required
    - `fields` object, required
    - `connector` object
      - `id` string, required
      - `version` integer, required
    - `flow` object
      - `baseUrl` string, uri, required
      - `steps` object[], required
        - `id` string, required
        - `method` 'GET' | 'POST'
        - `url` string, required
        - `headers` object
        - `body` Url (unresolved $ref)
        - `capture` object
        - `expect` object
          - `status` integer
          - `contains` string
          - `notContains` string
        - `extract` true
        - `paginate` object
          - `start` integer
          - `step` integer
          - `maxPages` integer, required
    - `inputs` object
      - `datasetId` string, uuid, required
      - `version` integer, required
      - `key` Id, required (unresolved $ref)
      - `max` integer, required
    - `pagination` union
      - object
        - `kind` 'param', required
        - `param` string, required
        - `start` integer
        - `step` integer
        - `maxPages` integer, required
      - object
        - `kind` 'next', required
        - `selector` Items, required (unresolved $ref)
        - `maxPages` integer, required
    - `waitFor` Items (unresolved $ref)
    - `actions` union[]
      - union
        - object
          - `kind` 'click', required
          - `selector` Items, required (unresolved $ref)
          - `times` integer
        - object
          - `kind` 'scroll', required
          - `times` Times (unresolved $ref)
        - object
          - `kind` 'waitFor', required
          - `selector` Items, required (unresolved $ref)
        - object
          - `kind` 'dismiss', required
          - `selector` Items, required (unresolved $ref)
        - object
          - `kind` 'select', required
          - `selector` Items, required (unresolved $ref)
          - `value` string, required
        - object
          - `kind` 'fill', required
          - `selector` Items, required (unresolved $ref)
          - `value` string, required
          - `submit` boolean
    - `required` string[]
    - `csv` object
      - `delimiter` ',' | '	' | ';' | '|'
      - `header` boolean
      - `encoding` 'utf-8' | 'latin1' | 'windows-1252'
    - `types` object
  - `rights` true, required: Confirms you have the right to collect this source (Terms §4)
  - `schedule` 'manual' | 'hourly' | 'daily' | 'weekly'
  - `key_field` string, nullable
  - `catalog` object: Pin the exact published Verified recipe. Modified or stale definitions are rejected.
    - `slug` string, required
    - `version_id` string, uuid, required

## Response `201`

The created source

- Source: A monitored source: a URL, a recipe and a schedule.
  - `id` string, uuid, required
  - `project_id` string, uuid, required
  - `name` string, required
  - `url` string, required
  - `recipe` object, required: A recipe@1 document (see the Recipe schema)
  - `version` integer, required
  - `recipe_version_id` string, uuid, nullable: The immutable reviewed recipe version, or null for a custom source
  - `schedule` 'manual' | 'hourly' | 'daily' | 'weekly', required
  - `key_field` string, nullable, required
  - `next_run_at` string, nullable, required: ISO-8601 timestamp (UTC)
  - `created_at` string, required: ISO-8601 timestamp (UTC)
  - `updated_at` string, required: ISO-8601 timestamp (UTC)

## Other responses

- `400`: Problem details; `code` is `validation`
- `401`: Problem details; `code` is `unauthenticated`
- `402`: Problem details; `code` is `plan_limit`
- `403`: Problem details; `code` is `forbidden`
- `409`: Problem details; `code` is `policy` or `conflict`
- `422`: Problem details; `code` is `idempotency_mismatch`
- `429`: Problem details; `code` is `rate_limited`
- `500`: Problem details; `code` is `internal`

## Changes

- **2026-10-20** `190cbe57a5e8`: 2 info
  - added the new optional request property `recipe/flow/steps/items/extract`
  - added the new optional request property `recipe/flow/steps/items/paginate`

[Operation history](https://skmtc.dev/sourcefinch/apis/sourcefinch-api/changes/v1/sources/post.md)

---

[API](https://skmtc.dev/sourcefinch/apis/sourcefinch-api.md) · [All operations](https://skmtc.dev/sourcefinch/apis/sourcefinch-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sourcefinch/apis/sourcefinch-api/revisions/190cbe57a5e8?raw)
