> For the complete documentation index, see [llms.txt](https://docs.synoptic.com/s/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.synoptic.com/s/rest/api-reference.md).

# API Reference

{% hint style="warning" %}
This API is in active development. Some functions may not be stable yet, and the interface is subject to change.
{% endhint %}

## Contents

* [Streams](#streams)
  * [Get stream](#get-stream)
  * [List streams](#list-streams)
* [Stream follows](#stream-follows)
  * [List followed streams](#list-followed-streams)
  * [Follow stream](#follow-stream)
  * [Unfollow stream](#unfollow-stream)
* [Posts](#posts)
  * [Post retrieval constraints](#post-retrieval-constraints)
  * [List stream posts](#list-stream-posts)
  * [Search stream posts](#search-stream-posts)
  * [List enterprise stream posts](#list-enterprise-stream-posts)
  * [Get post](#get-post)
  * [Create post](#create-post)
* [Custom targets](#custom-targets)
  * [Get custom targets](#get-custom-targets)
  * [Set custom targets](#set-custom-targets)
  * [Patch custom targets](#patch-custom-targets)
* [Sources](#sources)
  * [Get source custom targets](#get-source-custom-targets)
* [Reject targets](#reject-targets)
  * [Get reject targets](#get-reject-targets)
* [Stream packages](#stream-packages)
  * [List stream packages](#list-stream-packages)
  * [List stream package streams](#list-stream-package-streams)
* [Schemas](#schemas)

## Streams

### Get stream

## GET /v1/streams/{streamId}

> Gets basic information about the specified stream.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}":{"get":{"description":"Gets basic information about the specified stream.","operationId":"StreamsController_getStreamDescription","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamInfoResponse"}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"StreamInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"customTargetsData":{"description":"Custom targets data","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/CustomTargetsData"}]},"label":{"type":"string","description":"The stream label"},"paidData":{"nullable":true,"description":"Paid stream data","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}},"packageOnly":{"type":"boolean","description":"Whether this stream is only available as part of a package"},"customTargets":{"description":"Property of custom streams only. Followers receive their selected custom targets. Stream author receives a list of all custom targets selected by followers.","nullable":true,"type":"array","items":{"type":"string"}}},"required":["id","name","description","customTargetsData","label","paidData","packageOnly","customTargets"]},"CustomTargetsData":{"type":"object","properties":{"minTargets":{"type":"number","description":"Minimum number of custom targets a follower must select."},"maxTargets":{"type":"number","description":"Maximum number of custom targets a follower may select."},"stepSize":{"type":"number","description":"Step size for selecting custom targets."},"maxTotalTargets":{"type":"number","description":"Maximum total number of custom targets allowed for the stream."},"targetType":{"type":"string","description":"Label for the custom target type shown to followers."},"targetTypeInstruction":{"type":"string","description":"Instructions shown to followers when selecting custom targets."},"targetValidationRegex":{"type":"string","description":"Optional regex used to validate custom target values."}},"required":["minTargets","maxTargets","stepSize","targetType","targetTypeInstruction"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

### List streams

## GET /v1/streams

> Returns a paginated list of public streams with optional filtering.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams":{"get":{"description":"Returns a paginated list of public streams with optional filtering.","operationId":"StreamsController_getStreams","parameters":[{"name":"limit","required":false,"in":"query","description":"Limit of streams to return.","schema":{"minimum":1,"maximum":50,"default":10,"type":"number"}},{"name":"nextToken","required":false,"in":"query","description":"Opaque pagination cursor returned by a previous page.","schema":{"type":"string"}},{"name":"streamCategory","required":false,"in":"query","description":"Category of the stream.","schema":{"type":"string","enum":["NEWS","ON_CHAIN","MARKETS","OSINT","OTHER","REGULATORY"]}},{"name":"pricingType","required":false,"in":"query","description":"Pricing type.","schema":{"type":"string","enum":["FREE","PAID","ALL","PACKAGE_ONLY"]}},{"name":"hasCustomTargets","required":false,"in":"query","description":"Filter streams by custom targets: true returns only streams with custom targets, false returns only streams without custom targets.","schema":{"type":"boolean"}},{"name":"sortBy","required":false,"in":"query","description":"Sort by.","schema":{"default":"FOLLOWERS","type":"string","enum":["FEATURED","FOLLOWERS","CREATED_AT"]}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamsResponse"}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"GetStreamsResponse":{"type":"object","properties":{"streams":{"type":"array","items":{"$ref":"#/components/schemas/StreamListInfoResponse"}},"nextToken":{"type":"string","nullable":true}},"required":["streams","nextToken"]},"StreamListInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"customTargetsData":{"description":"Custom targets data","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/CustomTargetsData"}]},"label":{"type":"string","description":"The stream label"},"paidData":{"nullable":true,"description":"Paid stream data","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}},"packageOnly":{"type":"boolean","description":"Whether this stream is only available as part of a package"}},"required":["id","name","description","customTargetsData","label","paidData","packageOnly"]},"CustomTargetsData":{"type":"object","properties":{"minTargets":{"type":"number","description":"Minimum number of custom targets a follower must select."},"maxTargets":{"type":"number","description":"Maximum number of custom targets a follower may select."},"stepSize":{"type":"number","description":"Step size for selecting custom targets."},"maxTotalTargets":{"type":"number","description":"Maximum total number of custom targets allowed for the stream."},"targetType":{"type":"string","description":"Label for the custom target type shown to followers."},"targetTypeInstruction":{"type":"string","description":"Instructions shown to followers when selecting custom targets."},"targetValidationRegex":{"type":"string","description":"Optional regex used to validate custom target values."}},"required":["minTargets","maxTargets","stepSize","targetType","targetTypeInstruction"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

## Stream follows

### List followed streams

## GET /v1/streams/followed

> Returns streams followed by the provided API key.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/followed":{"get":{"description":"Returns streams followed by the provided API key.","operationId":"StreamsController_getFollowedStreams","parameters":[{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FollowedStreamResponseDTO"}}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"FollowedStreamResponseDTO":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"label":{"type":"string","description":"The stream label"}},"required":["id","name","description","label"]}}}}
```

### Follow stream

## POST /v1/streams/{streamId}/follow

> Follows the specified stream for the provided API key.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/follow":{"post":{"description":"Follows the specified stream for the provided API key.","operationId":"StreamsController_followStream","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"boolean"}}}}},"summary":"","tags":["Streams"]}}}}
```

### Unfollow stream

## DELETE /v1/streams/{streamId}/follow

> Unfollows the specified stream for the provided API key.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/follow":{"delete":{"description":"Unfollows the specified stream for the provided API key.","operationId":"StreamsController_unfollowStream","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"boolean"}}}}},"summary":"","tags":["Streams"]}}}}
```

## Posts

### Post retrieval constraints

Use the post retrieval endpoints below for backfills, history pages, and targeted lookups. Prefer WebSocket subscriptions for realtime delivery.

* `GET /v1/streams/{streamId}/posts`, `GET /v1/streams/{streamId}/posts/search`, and `GET /v1/streams/{streamId}/enterprise-posts` are each limited to 1 request per second.
* `GET /v1/streams/{streamId}/posts` is tracked by `x-api-key` when present and falls back to client IP when the header is absent.
* A throttled request returns HTTP 429. Wait at least one second before retrying and add jitter for shared workers or batch jobs.
* `limit` is capped at 50. Use `nextToken` for list endpoints and `offset` for post search pagination.

### List stream posts

## GET /v1/streams/{streamId}/posts

> Gets posts from the specified stream. You must be a follower of the stream. Rate limited to 1 request per second.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/posts":{"get":{"description":"Gets posts from the specified stream. You must be a follower of the stream. Rate limited to 1 request per second.","operationId":"StreamsController_getStreamPosts","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Limit of posts to retrieve.","schema":{"default":50,"type":"number"}},{"name":"nextToken","required":false,"in":"query","description":"Cursor for pagination (base64-encoded LastEvaluatedKey).","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Return posts created after this ISO 8601 timestamp.","schema":{"format":"date-time","type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Return posts created before this ISO 8601 timestamp.","schema":{"format":"date-time","type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamPostsResponse"}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"StreamPostsResponse":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/StreamPostDto"}},"nextToken":{"type":"string","nullable":true}},"required":["posts","nextToken"]},"StreamPostDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream post"},"streamId":{"type":"string","description":"The ID of the stream"},"text":{"type":"string","description":"The text of the stream post"},"createdAt":{"type":"string","description":"The date and time of the stream post in ISO8601 format"},"customTarget":{"type":"string","description":"The custom target of the stream post"},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":50,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 10000 chars."},"mediaUploadURLs":{"description":"Presigned URLs for uploading media files","type":"array","items":{"$ref":"#/components/schemas/MediaUploadUrlDTO"}},"failedUploadURLs":{"description":"Failed media upload URLs with error messages","type":"array","items":{"$ref":"#/components/schemas/FailedUploadUrlDTO"}}},"required":["id","streamId","text","createdAt"]},"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]},"MediaUploadUrlDTO":{"type":"object","properties":{"type":{"type":"string","description":"MIME type of the file"},"url":{"type":"string","description":"Pre-signed URL for uploading the file. This URL is valid for a 60 minute period."}},"required":["type","url"]},"FailedUploadUrlDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"},"message":{"type":"string","description":"Error message for the failed upload"}},"required":["mimeType","message"]}}}}
```

### Search stream posts

## GET /v1/streams/{streamId}/posts/search

> Full-text search over posts in the specified stream. You must be a follower of the stream. Rate limited to 1 request per second.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/posts/search":{"get":{"description":"Full-text search over posts in the specified stream. You must be a follower of the stream. Rate limited to 1 request per second.","operationId":"StreamsController_searchStreamPosts","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"text","required":true,"in":"query","description":"Full-text search query.","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Limit of posts to retrieve.","schema":{"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Offset for pagination.","schema":{"default":0,"type":"number"}},{"name":"fromDate","required":false,"in":"query","description":"Return posts created after this ISO 8601 timestamp.","schema":{"format":"date-time","type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Return posts created before this ISO 8601 timestamp.","schema":{"format":"date-time","type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamPostsResponse"}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"StreamPostsResponse":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/StreamPostDto"}},"nextToken":{"type":"string","nullable":true}},"required":["posts","nextToken"]},"StreamPostDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream post"},"streamId":{"type":"string","description":"The ID of the stream"},"text":{"type":"string","description":"The text of the stream post"},"createdAt":{"type":"string","description":"The date and time of the stream post in ISO8601 format"},"customTarget":{"type":"string","description":"The custom target of the stream post"},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":50,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 10000 chars."},"mediaUploadURLs":{"description":"Presigned URLs for uploading media files","type":"array","items":{"$ref":"#/components/schemas/MediaUploadUrlDTO"}},"failedUploadURLs":{"description":"Failed media upload URLs with error messages","type":"array","items":{"$ref":"#/components/schemas/FailedUploadUrlDTO"}}},"required":["id","streamId","text","createdAt"]},"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]},"MediaUploadUrlDTO":{"type":"object","properties":{"type":{"type":"string","description":"MIME type of the file"},"url":{"type":"string","description":"Pre-signed URL for uploading the file. This URL is valid for a 60 minute period."}},"required":["type","url"]},"FailedUploadUrlDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"},"message":{"type":"string","description":"Error message for the failed upload"}},"required":["mimeType","message"]}}}}
```

### List enterprise stream posts

## GET /v1/streams/{streamId}/enterprise-posts

> Gets enterprise posts from the specified stream. You must be a follower of the stream. Supports filtering by idempotency key, leaf availability zone, and date range. Rate limited to 1 request per second.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/enterprise-posts":{"get":{"description":"Gets enterprise posts from the specified stream. You must be a follower of the stream. Supports filtering by idempotency key, leaf availability zone, and date range. Rate limited to 1 request per second.","operationId":"StreamsController_getEnterpriseStreamPosts","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Limit of enterprise posts to retrieve.","schema":{"default":10,"type":"number"}},{"name":"nextToken","required":false,"in":"query","description":"Cursor for pagination (base64-encoded LastEvaluatedKey).","schema":{"type":"string"}},{"name":"idempotencyKey","required":false,"in":"query","description":"Filter by idempotency key.","schema":{"type":"string"}},{"name":"leafAz","required":false,"in":"query","description":"Filter by leaf availability zone.","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Return posts created after this ISO 8601 timestamp.","schema":{"type":"string"}},{"name":"toDate","required":false,"in":"query","description":"Return posts created before this ISO 8601 timestamp.","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseStreamPostsResponse"}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"EnterpriseStreamPostsResponse":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/EnterpriseStreamPostDto"}},"nextToken":{"type":"string","nullable":true}},"required":["posts","nextToken"]},"EnterpriseStreamPostDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","description":"Idempotency key of the enterprise post."},"leafAz":{"type":"string","description":"Leaf availability zone of the enterprise post."},"streamId":{"type":"string","description":"The ID of the stream."},"post":{"description":"Enterprise post payload.","allOf":[{"$ref":"#/components/schemas/EnterpriseStreamPostDataDto"}]},"root":{"description":"Root node metadata.","allOf":[{"$ref":"#/components/schemas/EnterpriseNodeDataDto"}]},"leaf":{"description":"Leaf node metadata.","allOf":[{"$ref":"#/components/schemas/EnterpriseNodeDataDto"}]},"createdAt":{"type":"string","description":"ISO 8601 timestamp when the post was created."}},"required":["idempotencyKey","leafAz","streamId","post","root","leaf","createdAt"]},"EnterpriseStreamPostDataDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","description":"Idempotency key of the enterprise post."},"text":{"type":"string","description":"Text content of the enterprise post."}},"required":["idempotencyKey","text"]},"EnterpriseNodeDataDto":{"type":"object","properties":{"ip":{"type":"string","description":"Node IP address."},"az":{"type":"string","description":"Availability zone of the node."},"timestamp":{"type":"string","description":"ISO 8601 timestamp of the node event."}},"required":["ip","az","timestamp"]}}}}
```

### Get post

## GET /v1/streams/{streamId}/post/{postId}

> Returns a single post from the specified stream. Returns 404 if the post does not exist or does not belong to this stream.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/post/{postId}":{"get":{"description":"Returns a single post from the specified stream. Returns 404 if the post does not exist or does not belong to this stream.","operationId":"StreamsController_getStreamPost","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"postId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamPostDto"}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"StreamPostDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream post"},"streamId":{"type":"string","description":"The ID of the stream"},"text":{"type":"string","description":"The text of the stream post"},"createdAt":{"type":"string","description":"The date and time of the stream post in ISO8601 format"},"customTarget":{"type":"string","description":"The custom target of the stream post"},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":50,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 10000 chars."},"mediaUploadURLs":{"description":"Presigned URLs for uploading media files","type":"array","items":{"$ref":"#/components/schemas/MediaUploadUrlDTO"}},"failedUploadURLs":{"description":"Failed media upload URLs with error messages","type":"array","items":{"$ref":"#/components/schemas/FailedUploadUrlDTO"}}},"required":["id","streamId","text","createdAt"]},"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]},"MediaUploadUrlDTO":{"type":"object","properties":{"type":{"type":"string","description":"MIME type of the file"},"url":{"type":"string","description":"Pre-signed URL for uploading the file. This URL is valid for a 60 minute period."}},"required":["type","url"]},"FailedUploadUrlDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"},"message":{"type":"string","description":"Error message for the failed upload"}},"required":["mimeType","message"]}}}}
```

### Create post

## POST /v1/streams/{streamId}/post

> Adds a post to the specified stream. You must use the stream publisher key for this stream.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/post":{"post":{"description":"Adds a post to the specified stream. You must use the stream publisher key for this stream.","operationId":"StreamsController_addStreamPost","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostBodyDTO"}}}},"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamPostDto"}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"CreatePostBodyDTO":{"type":"object","properties":{"content":{"type":"string","description":"Content of the post."},"contentType":{"type":"string","deprecated":true,"description":"Deprecated. Previously specified how to process the content. The value is now ignored: posts are always stored as-is in the `text` field and rendered as markdown by clients. Accepts any string for backwards compatibility and will not cause the request to be rejected."},"customTarget":{"type":"string","description":"Custom target. Required [iff](https://en.wikipedia.org/wiki/If_and_only_if) posting to a custom stream."},"idempotencyKey":{"type":"string","description":"Idempotency key. If provided, the post will be ignored if a post for the same stream and idempotencyKey already exists."},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"uploadMedia":{"description":"List of MIME types of pre-uploaded files","type":"array","items":{"$ref":"#/components/schemas/PreUploadedFileTypeDTO"}},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":150,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 15000 chars."}},"required":["content"]},"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]},"PreUploadedFileTypeDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"}},"required":["mimeType"]},"StreamPostDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream post"},"streamId":{"type":"string","description":"The ID of the stream"},"text":{"type":"string","description":"The text of the stream post"},"createdAt":{"type":"string","description":"The date and time of the stream post in ISO8601 format"},"customTarget":{"type":"string","description":"The custom target of the stream post"},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":50,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 10000 chars."},"mediaUploadURLs":{"description":"Presigned URLs for uploading media files","type":"array","items":{"$ref":"#/components/schemas/MediaUploadUrlDTO"}},"failedUploadURLs":{"description":"Failed media upload URLs with error messages","type":"array","items":{"$ref":"#/components/schemas/FailedUploadUrlDTO"}}},"required":["id","streamId","text","createdAt"]},"MediaUploadUrlDTO":{"type":"object","properties":{"type":{"type":"string","description":"MIME type of the file"},"url":{"type":"string","description":"Pre-signed URL for uploading the file. This URL is valid for a 60 minute period."}},"required":["type","url"]},"FailedUploadUrlDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"},"message":{"type":"string","description":"Error message for the failed upload"}},"required":["mimeType","message"]}}}}
```

## Custom targets

Subscriber endpoints for a **stream ID**. Use `GET /v1/streams/{streamId}` for stream metadata; for custom streams, `customTargets` on that response is the union of all followers’ targets when the API key user is the stream author.

### Get custom targets

Returns the **caller's** configured targets for the stream (not the author union). Requires a follower subscription.

## GET /v1/streams/{streamId}/custom-targets

> Returns custom targets selected by the requesting user for the specified stream. You must be a follower of the stream.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/custom-targets":{"get":{"description":"Returns custom targets selected by the requesting user for the specified stream. You must be a follower of the stream.","operationId":"StreamsController_getStreamCustomTargets","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"summary":"","tags":["Streams"]}}}}
```

### Set custom targets

## POST /v1/streams/{streamId}/custom-targets

> Sets custom targets for the specified stream. You must be a follower of the stream.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/custom-targets":{"post":{"description":"Sets custom targets for the specified stream. You must be a follower of the stream.","operationId":"StreamsController_setStreamCustomTargets","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCustomTargetsBodyDTO"}}}},"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"SetCustomTargetsBodyDTO":{"type":"object","properties":{"customTargets":{"description":"Custom targets to set for the stream.","type":"array","items":{"type":"string"}}},"required":["customTargets"]}}}}
```

### Patch custom targets

## PATCH /v1/streams/{streamId}/custom-targets

> Adds and/or removes custom targets for a stream. You must be a follower of the stream.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/custom-targets":{"patch":{"description":"Adds and/or removes custom targets for a stream. You must be a follower of the stream.","operationId":"StreamsController_patchStreamCustomTargets","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchCustomTargetsBodyDTO"}}}},"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"PatchCustomTargetsBodyDTO":{"type":"object","properties":{"add":{"description":"Custom targets to add for the stream.","type":"array","items":{"type":"string"}},"remove":{"description":"Custom targets to remove from the stream.","type":"array","items":{"type":"string"}}}}}}}
```

## Sources

### Get source custom targets

Lists every follower `customTarget` on the custom stream behind a **source** (for example when publishing via [WebSocket source-post](/s/websocket/add-source-posts.md)).

* `GET /v1/sources/{sourceId}/custom-targets`
* Use the **same API key** (`x-api-key`) as for that source’s WebSocket connection—not a reader or publisher stream key.
* Response: JSON array of target strings.

## GET /v1/sources/{sourceId}/custom-targets

> All followers’ custom targets on the custom stream behind this source. Use the same x-api-key as WebSocket source-post for this source.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/sources/{sourceId}/custom-targets":{"get":{"description":"All followers’ custom targets on the custom stream behind this source. Use the same x-api-key as WebSocket source-post for this source.","operationId":"SourcesController_getSourceCustomTargets","parameters":[{"name":"sourceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"summary":"","tags":["Sources"]}}}}
```

## Reject targets

### Get reject targets

## GET /v1/streams/{streamId}/reject-targets

> Returns the list of rejected custom targets (with optional reasons) for the specified stream. You must be a follower of the stream.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/streams/{streamId}/reject-targets":{"get":{"description":"Returns the list of rejected custom targets (with optional reasons) for the specified stream. You must be a follower of the stream.","operationId":"StreamsController_getStreamRejectedTargets","parameters":[{"name":"streamId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RejectedTargetResponseDTO"}}}}}},"summary":"","tags":["Streams"]}}},"components":{"schemas":{"RejectedTargetResponseDTO":{"type":"object","properties":{"customTarget":{"type":"string","description":"Custom target that was rejected by the publisher."},"rejectedAt":{"type":"string","description":"ISO 8601 timestamp of when this target was first rejected."},"lastRejectedAt":{"type":"string","description":"ISO 8601 timestamp of when this target was last rejected."},"reasons":{"description":"Reasons why the custom target was rejected.","type":"array","items":{"type":"string"}}},"required":["customTarget","rejectedAt","lastRejectedAt","reasons"]}}}}
```

## Stream packages

### List stream packages

## GET /v1/stream-packages

> Returns a paginated list of stream packages with optional filtering.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/stream-packages":{"get":{"description":"Returns a paginated list of stream packages with optional filtering.","operationId":"StreamPackagesController_getStreamPackages","parameters":[{"name":"limit","required":false,"in":"query","description":"Limit of stream packages to return.","schema":{"minimum":1,"maximum":50,"default":10,"type":"number"}},{"name":"nextToken","required":false,"in":"query","description":"Token to get the next page of stream packages.","schema":{"type":"string"}},{"name":"streamPackageCategory","required":false,"in":"query","description":"Category of the stream package.","schema":{"type":"string","enum":["NEWS","ON_CHAIN","MARKETS","OSINT","OTHER","REGULATORY"]}},{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamPackagesResponse"}}}}},"summary":"","tags":["StreamPackages"]}}},"components":{"schemas":{"GetStreamPackagesResponse":{"type":"object","properties":{"streamPackages":{"type":"array","items":{"$ref":"#/components/schemas/StreamPackageInfoResponse"}},"nextToken":{"type":"string","nullable":true}},"required":["streamPackages","nextToken"]},"StreamPackageInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream package."},"name":{"type":"string","description":"The name of the stream package."},"description":{"type":"string","nullable":true,"description":"Plain text description of the stream package."},"label":{"type":"string","description":"The stream package label."},"streamPackageCategory":{"type":"string","enum":["NEWS","ON_CHAIN","MARKETS","OSINT","OTHER","REGULATORY"],"description":"The stream package category."},"badge":{"type":"string","enum":["EXCLUSIVE_CONTENT","SAVE_VALUE"],"description":"The stream package badge."},"paidData":{"description":"Paid stream package data.","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}}},"required":["id","name","description","label","streamPackageCategory","badge","paidData"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

### List stream package streams

## GET /v1/stream-packages/{streamPackageId}/streams

> Returns streams included in the specified stream package.

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"servers":[{"url":"https://api.synoptic.com"}],"paths":{"/v1/stream-packages/{streamPackageId}/streams":{"get":{"description":"Returns streams included in the specified stream package.","operationId":"StreamPackagesController_getStreamPackageStreams","parameters":[{"name":"x-api-key","description":"API key for authentication","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"default":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreamListInfoResponse"}}}}}},"summary":"","tags":["StreamPackages"]}}},"components":{"schemas":{"StreamListInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"customTargetsData":{"description":"Custom targets data","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/CustomTargetsData"}]},"label":{"type":"string","description":"The stream label"},"paidData":{"nullable":true,"description":"Paid stream data","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}},"packageOnly":{"type":"boolean","description":"Whether this stream is only available as part of a package"}},"required":["id","name","description","customTargetsData","label","paidData","packageOnly"]},"CustomTargetsData":{"type":"object","properties":{"minTargets":{"type":"number","description":"Minimum number of custom targets a follower must select."},"maxTargets":{"type":"number","description":"Maximum number of custom targets a follower may select."},"stepSize":{"type":"number","description":"Step size for selecting custom targets."},"maxTotalTargets":{"type":"number","description":"Maximum total number of custom targets allowed for the stream."},"targetType":{"type":"string","description":"Label for the custom target type shown to followers."},"targetTypeInstruction":{"type":"string","description":"Instructions shown to followers when selecting custom targets."},"targetValidationRegex":{"type":"string","description":"Optional regex used to validate custom target values."}},"required":["minTargets","maxTargets","stepSize","targetType","targetTypeInstruction"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

## Schemas

## The CustomTargetsData object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"CustomTargetsData":{"type":"object","properties":{"minTargets":{"type":"number","description":"Minimum number of custom targets a follower must select."},"maxTargets":{"type":"number","description":"Maximum number of custom targets a follower may select."},"stepSize":{"type":"number","description":"Step size for selecting custom targets."},"maxTotalTargets":{"type":"number","description":"Maximum total number of custom targets allowed for the stream."},"targetType":{"type":"string","description":"Label for the custom target type shown to followers."},"targetTypeInstruction":{"type":"string","description":"Instructions shown to followers when selecting custom targets."},"targetValidationRegex":{"type":"string","description":"Optional regex used to validate custom target values."}},"required":["minTargets","maxTargets","stepSize","targetType","targetTypeInstruction"]}}}}
```

## The StreamInfoResponse object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"StreamInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"customTargetsData":{"description":"Custom targets data","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/CustomTargetsData"}]},"label":{"type":"string","description":"The stream label"},"paidData":{"nullable":true,"description":"Paid stream data","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}},"packageOnly":{"type":"boolean","description":"Whether this stream is only available as part of a package"},"customTargets":{"description":"Property of custom streams only. Followers receive their selected custom targets. Stream author receives a list of all custom targets selected by followers.","nullable":true,"type":"array","items":{"type":"string"}}},"required":["id","name","description","customTargetsData","label","paidData","packageOnly","customTargets"]},"CustomTargetsData":{"type":"object","properties":{"minTargets":{"type":"number","description":"Minimum number of custom targets a follower must select."},"maxTargets":{"type":"number","description":"Maximum number of custom targets a follower may select."},"stepSize":{"type":"number","description":"Step size for selecting custom targets."},"maxTotalTargets":{"type":"number","description":"Maximum total number of custom targets allowed for the stream."},"targetType":{"type":"string","description":"Label for the custom target type shown to followers."},"targetTypeInstruction":{"type":"string","description":"Instructions shown to followers when selecting custom targets."},"targetValidationRegex":{"type":"string","description":"Optional regex used to validate custom target values."}},"required":["minTargets","maxTargets","stepSize","targetType","targetTypeInstruction"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

## The StreamListInfoResponse object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"StreamListInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"customTargetsData":{"description":"Custom targets data","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/CustomTargetsData"}]},"label":{"type":"string","description":"The stream label"},"paidData":{"nullable":true,"description":"Paid stream data","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}},"packageOnly":{"type":"boolean","description":"Whether this stream is only available as part of a package"}},"required":["id","name","description","customTargetsData","label","paidData","packageOnly"]},"CustomTargetsData":{"type":"object","properties":{"minTargets":{"type":"number","description":"Minimum number of custom targets a follower must select."},"maxTargets":{"type":"number","description":"Maximum number of custom targets a follower may select."},"stepSize":{"type":"number","description":"Step size for selecting custom targets."},"maxTotalTargets":{"type":"number","description":"Maximum total number of custom targets allowed for the stream."},"targetType":{"type":"string","description":"Label for the custom target type shown to followers."},"targetTypeInstruction":{"type":"string","description":"Instructions shown to followers when selecting custom targets."},"targetValidationRegex":{"type":"string","description":"Optional regex used to validate custom target values."}},"required":["minTargets","maxTargets","stepSize","targetType","targetTypeInstruction"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

## The GetStreamsResponse object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"GetStreamsResponse":{"type":"object","properties":{"streams":{"type":"array","items":{"$ref":"#/components/schemas/StreamListInfoResponse"}},"nextToken":{"type":"string","nullable":true}},"required":["streams","nextToken"]},"StreamListInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"customTargetsData":{"description":"Custom targets data","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/CustomTargetsData"}]},"label":{"type":"string","description":"The stream label"},"paidData":{"nullable":true,"description":"Paid stream data","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}},"packageOnly":{"type":"boolean","description":"Whether this stream is only available as part of a package"}},"required":["id","name","description","customTargetsData","label","paidData","packageOnly"]},"CustomTargetsData":{"type":"object","properties":{"minTargets":{"type":"number","description":"Minimum number of custom targets a follower must select."},"maxTargets":{"type":"number","description":"Maximum number of custom targets a follower may select."},"stepSize":{"type":"number","description":"Step size for selecting custom targets."},"maxTotalTargets":{"type":"number","description":"Maximum total number of custom targets allowed for the stream."},"targetType":{"type":"string","description":"Label for the custom target type shown to followers."},"targetTypeInstruction":{"type":"string","description":"Instructions shown to followers when selecting custom targets."},"targetValidationRegex":{"type":"string","description":"Optional regex used to validate custom target values."}},"required":["minTargets","maxTargets","stepSize","targetType","targetTypeInstruction"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

## The StreamPackageInfoResponse object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"StreamPackageInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream package."},"name":{"type":"string","description":"The name of the stream package."},"description":{"type":"string","nullable":true,"description":"Plain text description of the stream package."},"label":{"type":"string","description":"The stream package label."},"streamPackageCategory":{"type":"string","enum":["NEWS","ON_CHAIN","MARKETS","OSINT","OTHER","REGULATORY"],"description":"The stream package category."},"badge":{"type":"string","enum":["EXCLUSIVE_CONTENT","SAVE_VALUE"],"description":"The stream package badge."},"paidData":{"description":"Paid stream package data.","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}}},"required":["id","name","description","label","streamPackageCategory","badge","paidData"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

## The GetStreamPackagesResponse object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"GetStreamPackagesResponse":{"type":"object","properties":{"streamPackages":{"type":"array","items":{"$ref":"#/components/schemas/StreamPackageInfoResponse"}},"nextToken":{"type":"string","nullable":true}},"required":["streamPackages","nextToken"]},"StreamPackageInfoResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream package."},"name":{"type":"string","description":"The name of the stream package."},"description":{"type":"string","nullable":true,"description":"Plain text description of the stream package."},"label":{"type":"string","description":"The stream package label."},"streamPackageCategory":{"type":"string","enum":["NEWS","ON_CHAIN","MARKETS","OSINT","OTHER","REGULATORY"],"description":"The stream package category."},"badge":{"type":"string","enum":["EXCLUSIVE_CONTENT","SAVE_VALUE"],"description":"The stream package badge."},"paidData":{"description":"Paid stream package data.","type":"array","items":{"$ref":"#/components/schemas/StripePrice"}}},"required":["id","name","description","label","streamPackageCategory","badge","paidData"]},"StripePrice":{"type":"object","properties":{"id":{"type":"string","description":"Stripe price ID."},"amount":{"type":"number","description":"Price amount in cents."},"interval":{"type":"string","enum":["month","year"],"description":"Billing interval for the price."},"intervalCount":{"type":"number","description":"Number of billing intervals between charges."}},"required":["id","amount","interval","intervalCount"]}}}}
```

## The ExchangePairDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]}}}}
```

## The MediaItemDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]}}}}
```

## The IconDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]}}}}
```

## The MetadataDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]}}}}
```

## The MediaUploadUrlDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"MediaUploadUrlDTO":{"type":"object","properties":{"type":{"type":"string","description":"MIME type of the file"},"url":{"type":"string","description":"Pre-signed URL for uploading the file. This URL is valid for a 60 minute period."}},"required":["type","url"]}}}}
```

## The FailedUploadUrlDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"FailedUploadUrlDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"},"message":{"type":"string","description":"Error message for the failed upload"}},"required":["mimeType","message"]}}}}
```

## The StreamPostDto object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"StreamPostDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream post"},"streamId":{"type":"string","description":"The ID of the stream"},"text":{"type":"string","description":"The text of the stream post"},"createdAt":{"type":"string","description":"The date and time of the stream post in ISO8601 format"},"customTarget":{"type":"string","description":"The custom target of the stream post"},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":50,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 10000 chars."},"mediaUploadURLs":{"description":"Presigned URLs for uploading media files","type":"array","items":{"$ref":"#/components/schemas/MediaUploadUrlDTO"}},"failedUploadURLs":{"description":"Failed media upload URLs with error messages","type":"array","items":{"$ref":"#/components/schemas/FailedUploadUrlDTO"}}},"required":["id","streamId","text","createdAt"]},"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]},"MediaUploadUrlDTO":{"type":"object","properties":{"type":{"type":"string","description":"MIME type of the file"},"url":{"type":"string","description":"Pre-signed URL for uploading the file. This URL is valid for a 60 minute period."}},"required":["type","url"]},"FailedUploadUrlDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"},"message":{"type":"string","description":"Error message for the failed upload"}},"required":["mimeType","message"]}}}}
```

## The StreamPostsResponse object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"StreamPostsResponse":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/StreamPostDto"}},"nextToken":{"type":"string","nullable":true}},"required":["posts","nextToken"]},"StreamPostDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream post"},"streamId":{"type":"string","description":"The ID of the stream"},"text":{"type":"string","description":"The text of the stream post"},"createdAt":{"type":"string","description":"The date and time of the stream post in ISO8601 format"},"customTarget":{"type":"string","description":"The custom target of the stream post"},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":50,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 10000 chars."},"mediaUploadURLs":{"description":"Presigned URLs for uploading media files","type":"array","items":{"$ref":"#/components/schemas/MediaUploadUrlDTO"}},"failedUploadURLs":{"description":"Failed media upload URLs with error messages","type":"array","items":{"$ref":"#/components/schemas/FailedUploadUrlDTO"}}},"required":["id","streamId","text","createdAt"]},"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]},"MediaUploadUrlDTO":{"type":"object","properties":{"type":{"type":"string","description":"MIME type of the file"},"url":{"type":"string","description":"Pre-signed URL for uploading the file. This URL is valid for a 60 minute period."}},"required":["type","url"]},"FailedUploadUrlDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"},"message":{"type":"string","description":"Error message for the failed upload"}},"required":["mimeType","message"]}}}}
```

## The EnterpriseNodeDataDto object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"EnterpriseNodeDataDto":{"type":"object","properties":{"ip":{"type":"string","description":"Node IP address."},"az":{"type":"string","description":"Availability zone of the node."},"timestamp":{"type":"string","description":"ISO 8601 timestamp of the node event."}},"required":["ip","az","timestamp"]}}}}
```

## The EnterpriseStreamPostDataDto object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"EnterpriseStreamPostDataDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","description":"Idempotency key of the enterprise post."},"text":{"type":"string","description":"Text content of the enterprise post."}},"required":["idempotencyKey","text"]}}}}
```

## The EnterpriseStreamPostDto object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"EnterpriseStreamPostDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","description":"Idempotency key of the enterprise post."},"leafAz":{"type":"string","description":"Leaf availability zone of the enterprise post."},"streamId":{"type":"string","description":"The ID of the stream."},"post":{"description":"Enterprise post payload.","allOf":[{"$ref":"#/components/schemas/EnterpriseStreamPostDataDto"}]},"root":{"description":"Root node metadata.","allOf":[{"$ref":"#/components/schemas/EnterpriseNodeDataDto"}]},"leaf":{"description":"Leaf node metadata.","allOf":[{"$ref":"#/components/schemas/EnterpriseNodeDataDto"}]},"createdAt":{"type":"string","description":"ISO 8601 timestamp when the post was created."}},"required":["idempotencyKey","leafAz","streamId","post","root","leaf","createdAt"]},"EnterpriseStreamPostDataDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","description":"Idempotency key of the enterprise post."},"text":{"type":"string","description":"Text content of the enterprise post."}},"required":["idempotencyKey","text"]},"EnterpriseNodeDataDto":{"type":"object","properties":{"ip":{"type":"string","description":"Node IP address."},"az":{"type":"string","description":"Availability zone of the node."},"timestamp":{"type":"string","description":"ISO 8601 timestamp of the node event."}},"required":["ip","az","timestamp"]}}}}
```

## The EnterpriseStreamPostsResponse object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"EnterpriseStreamPostsResponse":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/EnterpriseStreamPostDto"}},"nextToken":{"type":"string","nullable":true}},"required":["posts","nextToken"]},"EnterpriseStreamPostDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","description":"Idempotency key of the enterprise post."},"leafAz":{"type":"string","description":"Leaf availability zone of the enterprise post."},"streamId":{"type":"string","description":"The ID of the stream."},"post":{"description":"Enterprise post payload.","allOf":[{"$ref":"#/components/schemas/EnterpriseStreamPostDataDto"}]},"root":{"description":"Root node metadata.","allOf":[{"$ref":"#/components/schemas/EnterpriseNodeDataDto"}]},"leaf":{"description":"Leaf node metadata.","allOf":[{"$ref":"#/components/schemas/EnterpriseNodeDataDto"}]},"createdAt":{"type":"string","description":"ISO 8601 timestamp when the post was created."}},"required":["idempotencyKey","leafAz","streamId","post","root","leaf","createdAt"]},"EnterpriseStreamPostDataDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","description":"Idempotency key of the enterprise post."},"text":{"type":"string","description":"Text content of the enterprise post."}},"required":["idempotencyKey","text"]},"EnterpriseNodeDataDto":{"type":"object","properties":{"ip":{"type":"string","description":"Node IP address."},"az":{"type":"string","description":"Availability zone of the node."},"timestamp":{"type":"string","description":"ISO 8601 timestamp of the node event."}},"required":["ip","az","timestamp"]}}}}
```

## The PreUploadedFileTypeDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"PreUploadedFileTypeDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"}},"required":["mimeType"]}}}}
```

## The CreatePostBodyDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"CreatePostBodyDTO":{"type":"object","properties":{"content":{"type":"string","description":"Content of the post."},"contentType":{"type":"string","deprecated":true,"description":"Deprecated. Previously specified how to process the content. The value is now ignored: posts are always stored as-is in the `text` field and rendered as markdown by clients. Accepts any string for backwards compatibility and will not cause the request to be rejected."},"customTarget":{"type":"string","description":"Custom target. Required [iff](https://en.wikipedia.org/wiki/If_and_only_if) posting to a custom stream."},"idempotencyKey":{"type":"string","description":"Idempotency key. If provided, the post will be ignored if a post for the same stream and idempotencyKey already exists."},"metadata":{"description":"Metadata for the post. This is optional and can include various details like tags, source link, etc.","allOf":[{"$ref":"#/components/schemas/MetadataDTO"}]},"uploadMedia":{"description":"List of MIME types of pre-uploaded files","type":"array","items":{"$ref":"#/components/schemas/PreUploadedFileTypeDTO"}},"vendorMetadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":4000},{"type":"number"},{"type":"null"}]},"maxProperties":150,"description":"Vendor-specific metadata for the post. This can include additional information that is not part of the standard metadata. Total string length must be ≤ 15000 chars."}},"required":["content"]},"MetadataDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of the post."},"tickers":{"description":"List of tickers associated with the post.","type":"array","items":{"type":"string"}},"pairs":{"description":"List of pairs associated with the post.","type":"array","items":{"$ref":"#/components/schemas/ExchangePairDTO"}},"machineReadableText":{"type":"string","description":"Machine-readable text for the post."},"tags":{"description":"List of tags associated with the post.","type":"array","items":{"type":"string"}},"sourceLink":{"type":"string","description":"Source link for the post. This should be a valid URL."},"sourceName":{"type":"string","description":"Source name for the post."},"summary":{"type":"string","description":"Summary of the post. This should be a brief description.","maxLength":1000},"headline":{"type":"string","description":"Headline for the post.","maxLength":1000},"media":{"description":"Media items associated with the post.","type":"array","items":{"$ref":"#/components/schemas/MediaItemDTO"}},"icon":{"description":"Icon for the post. E.g. profile picture, logo, etc.","allOf":[{"$ref":"#/components/schemas/IconDTO"}]},"sourceTimestamp":{"type":"string","description":"Source timestamp for the post."},"targetRejectReason":{"type":"string","description":"Reason for rejecting the post.","maxLength":30},"targetUnRejectReason":{"type":"string","description":"Reason for un-rejecting the post.","maxLength":30}}},"ExchangePairDTO":{"type":"object","properties":{"exchange":{"type":"string","enum":["BINANCE_SPOT","BINANCE_PERPS","BYBIT_SPOT","BYBIT_PERPS","HYPE_PERPS","HYPE_SPOT","POLYMARKET","KALSHI"]},"value":{"type":"string"}},"required":["exchange","value"]},"MediaItemDTO":{"type":"object","properties":{"type":{"type":"string","description":"Type of media item.","enum":["image","video","audio"]},"url":{"type":"string","description":"URL of the media item."},"caption":{"type":"string","description":"Caption for the media item."},"credit":{"type":"string","description":"Credit for the media item."}},"required":["type","url"]},"IconDTO":{"type":"object","properties":{"url":{"type":"string","description":"URL of the icon."}},"required":["url"]},"PreUploadedFileTypeDTO":{"type":"object","properties":{"mimeType":{"type":"string","description":"MIME type of the file"}},"required":["mimeType"]}}}}
```

## The SetCustomTargetsBodyDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"SetCustomTargetsBodyDTO":{"type":"object","properties":{"customTargets":{"description":"Custom targets to set for the stream.","type":"array","items":{"type":"string"}}},"required":["customTargets"]}}}}
```

## The PatchCustomTargetsBodyDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"PatchCustomTargetsBodyDTO":{"type":"object","properties":{"add":{"description":"Custom targets to add for the stream.","type":"array","items":{"type":"string"}},"remove":{"description":"Custom targets to remove from the stream.","type":"array","items":{"type":"string"}}}}}}}
```

## The RejectedTargetResponseDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"RejectedTargetResponseDTO":{"type":"object","properties":{"customTarget":{"type":"string","description":"Custom target that was rejected by the publisher."},"rejectedAt":{"type":"string","description":"ISO 8601 timestamp of when this target was first rejected."},"lastRejectedAt":{"type":"string","description":"ISO 8601 timestamp of when this target was last rejected."},"reasons":{"description":"Reasons why the custom target was rejected.","type":"array","items":{"type":"string"}}},"required":["customTarget","rejectedAt","lastRejectedAt","reasons"]}}}}
```

## The FollowedStreamResponseDTO object

```json
{"openapi":"3.0.0","info":{"title":"Synoptic API","version":"1.0.0"},"components":{"schemas":{"FollowedStreamResponseDTO":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the stream"},"name":{"type":"string","description":"The name of the stream"},"description":{"type":"string","description":"The description of the stream","nullable":true},"label":{"type":"string","description":"The stream label"}},"required":["id","name","description","label"]}}}}
```
