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

# Create a source

`POST /v1/projects/{projectID}/sources`

This endpoint creates a source

## Path parameters

- `projectID` string, required

## Request body

- ModelsCreateSource
  - `body_function` string — Function is a javascript function used to mutate the payload immediately after ingesting an event
  - `custom_response` ModelsCustomResponse
    - `body` string
    - `content_type` string
  - `event_type_location` string — EventTypeLocation is used to specify where Convoy should read the event type from an incoming webhook request.
  - `header_function` string — Function is a javascript function used to mutate the headers immediately after ingesting an event
  - `idempotency_keys` string[] — IdempotencyKeys are used to specify parts of a webhook request to uniquely identify the event in an incoming webhooks project.
  - `name` string — Source name.
  - `provider` 'github' | 'twitter' | 'shopify' | ''
  - `pub_sub` ModelsPubSubConfig
    - `amqp` ModelsAmqpPubSubconfig
      - `auth` ModelsAmqpAuth
        - `password` string
        - `user` string
      - `bindExchange` ModelsAmqpExchange
        - `exchange` string
        - `routingKey` string
      - `deadLetterExchange` string
      - `host` string
      - `port` string
      - `queue` string
      - `schema` string
      - `vhost` string
    - `google` ModelsGooglePubSubConfig
      - `project_id` string
      - `service_account` string, byte — encoding/json marshals []byte as a base64 string on the wire.
      - `subscription_id` string
    - `kafka` ModelsKafkaPubSubConfig
      - `auth` ModelsKafkaAuth
        - `hash` string
        - `password` string
        - `tls` boolean
        - `type` string
        - `username` string
      - `brokers` string[]
      - `consumer_group_id` string
      - `topic_name` string
    - `sqs` ModelsSQSPubSubConfig
      - `access_key_id` string
      - `default_region` string
      - `queue_name` string
      - `secret_key` string
    - `type` 'sqs' | 'google' | 'kafka' | 'amqp' | ''
    - `workers` integer
  - `type` 'http' | 'rest_api' | 'pub_sub' | 'db_change_stream' | ''
  - `verifier` ModelsVerifierConfig
    - `api_key` ModelsApiKey
      - `header_name` string, required
      - `header_value` string, required
    - `basic_auth` ModelsBasicAuth
      - `password` string, required
      - `username` string, required
    - `hmac` ModelsHMac
      - `encoding` 'base64' | 'hex' | '', required
      - `hash` string, required
      - `header` string, required
      - `secret` string, required
    - `type` 'noop' | 'hmac' | 'basic_auth' | 'api_key' | '', required

## Response `201`

Created

- object
  - `message` string
  - `status` boolean
  - `data` ModelsSourceResponse
    - `body_function` string, nullable
    - `created_at` string
    - `custom_response` DatastoreCustomResponse
      - `body` string
      - `content_type` string
    - `deleted_at` string, nullable
    - `event_type_location` string
    - `forward_headers` string[]
    - `header_function` string, nullable
    - `idempotency_keys` string[]
    - `is_disabled` boolean
    - `mask_id` string
    - `name` string
    - `project_id` string
    - `provider` 'github' | 'twitter' | 'shopify' | ''
    - `provider_config` DatastoreProviderConfig
      - `twitter` DatastoreTwitterProviderConfig
        - `crc_verified_at` string, nullable
    - `pub_sub` DatastorePubSubConfig
      - `amqp` DatastoreAmqpPubSubConfig
        - `auth` DatastoreAmqpCredentials
          - `password` string
          - `user` string
        - `bindedExchange` string, nullable
        - `deadLetterExchange` string, nullable
        - `host` string
        - `port` string
        - `queue` string
        - `routingKey` string
        - `schema` string
        - `vhost` string, nullable
      - `google` DatastoreGooglePubSubConfig
        - `project_id` string
        - `service_account` string, byte — encoding/json marshals []byte as a base64 string on the wire.
        - `subscription_id` string
      - `kafka` DatastoreKafkaPubSubConfig
        - `auth` DatastoreKafkaAuth
          - `hash` string
          - `password` string
          - `tls` boolean
          - `type` string
          - `username` string
        - `brokers` string[]
        - `consumer_group_id` string
        - `topic_name` string
      - `sqs` DatastoreSQSPubSubConfig
        - `access_key_id` string
        - `default_region` string
        - `endpoint` string — Optional: for LocalStack testing
        - `queue_name` string
        - `secret_key` string
      - `type` 'sqs' | 'google' | 'kafka' | 'amqp' | ''
      - `workers` integer
    - `type` 'http' | 'rest_api' | 'pub_sub' | 'db_change_stream' | ''
    - `uid` string
    - `updated_at` string
    - `url` string
    - `verifier` DatastoreVerifierConfig
      - `api_key` DatastoreApiKey
        - `header_name` string
        - `header_value` string
      - `basic_auth` DatastoreBasicAuth
        - `password` string
        - `username` string
      - `hmac` DatastoreHMac
        - `encoding` 'base64' | 'hex' | ''
        - `hash` string
        - `header` string
        - `secret` string
      - `type` 'noop' | 'hmac' | 'basic_auth' | 'api_key' | ''

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `404` — Not Found

---

[API](https://skmtc.net/frain-dev/apis/convoy-api-reference.md) · [All operations](https://skmtc.net/frain-dev/apis/convoy-api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/frain-dev/convoy-api-reference/versions/dbd5b4f9cf13/schema)
