---
# @generated by sylphx-gen 0.1.0 from contracts@e145cc7cf1bc9605f2b27439e5e17ed76a1a2fd7e7021906a013f7565e4a0cd5. Do not edit.
title: "Publish a topic"
description: "`events.topics.publish` (POST /v1/{name}:publish): Publishes CloudEvents into a Topic, atomically."
type: reference
product: queues
summary: "Publishes CloudEvents into a Topic, atomically."
updated: 2026-09-28
nav: false
---

> **This method is not served on the public API.** `api.sylphx.com` does not route this call: its backend is not deployed behind the public API, or does not implement the call. This page documents the contract. It is kept out of the sidebar and of search engines.

Publishes CloudEvents into a Topic, atomically. Replaying the same `source` + `id` with the same payload returns the stored event; a different payload fails with RESOURCE_ALREADY_EXISTS.

- **Path** `POST https://api.sylphx.com/v1/orgs/acme/projects/shop/envs/production/topics/topic:publish`
- **Scope** `events:publish`
- **Effect** `write` — a successful call changes state.
- **Collection** [topics](/docs/api/topics)

## Request

| Field | Type | What it is |
| --- | --- | --- |
| `name` | `string` | The name of the topic. Required. |
| `events` | `CloudEvent[]` | The events, at most 100. Required. |

### CloudEvent

| Field | Type | What it is |
| --- | --- | --- |
| `id` | `string` | Unique per `source`; with `source` it is the dedupe key. Required. |
| `source` | `string` | The producer's URI-reference. Required. |
| `type` | `string` | The event type, for example `com.example.order.created`. Required. |
| `subject` | `string` | The subject within the source. |
| `event_time` | `timestamp` | When the occurrence happened. |
| `data_content_type` | `string` | The payload media type; default `application/json`. |
| `data_schema` | `string` | The payload schema URI. |
| `data` | `value` | The payload. |
| `extensions` | `map<string, string>` | Extension attributes, at most 64. |

## Response

| Field | Type | What it is |
| --- | --- | --- |
| `events` | `Event[]` | The stored events, in request order. |

### Event

| Field | Type | What it is |
| --- | --- | --- |
| `name` | `string` | `orgs/{org}/projects/{project}/envs/{env}/events/{event}`. |
| `uid` | `string` | `evt_<cell><ulid>`; never reused. Output only. |
| `meta` | `ResourceMeta` | Resource metadata. |
| `topic` | `string` | The Topic it was published to. Output only. |
| `source` | `string` | The producer's CloudEvents `source`. Output only. |
| `event_id` | `string` | The producer's CloudEvents `id`, unique per `source`. Output only. |
| `type` | `string` | The CloudEvents `type`. Output only. |
| `subject` | `string` | The CloudEvents `subject`. Output only. |
| `event_time` | `timestamp` | The CloudEvents `time`. Output only. |
| `data_content_type` | `string` | The CloudEvents `datacontenttype`. Output only. |
| `data_schema` | `string` | The CloudEvents `dataschema`. Output only. |
| `data` | `value` | The payload. Output only. |
| `extensions` | `map<string, string>` | CloudEvents extension attributes. Output only. |
| `admit_time` | `timestamp` | When Events admitted it. Output only. |

### ResourceMeta

| Field | Type | What it is |
| --- | --- | --- |
| `generation` | `int64` | Increases by one on every change to `spec`. Output only. |
| `etag` | `string` | Strong ETag (AIP-154): changes on any change to spec, status, or metadata. Send it back as `If-Match` or `etag` to make Update and Delete conditional; a mismatch fails with ABORTED / 409 `ETAG_MISMATCH`. Output only. |
| `create_time` | `timestamp` | When the Resource was created. Output only. |
| `update_time` | `timestamp` | When the Resource last changed. Output only. |
| `delete_time` | `timestamp` | Set while the Resource is being deleted. Output only. |
| `labels` | `map<string, string>` | Caller-writable, indexed labels (AIP-122 label rules). |
| `annotations` | `map<string, string>` | Caller-writable, unindexed annotations. |
| `display_name` | `string` | Caller-writable human-readable name. |
| `creator` | `string` | The principal that created the Resource. Output only. |

## Errors

- [`UNAUTHENTICATED`](/docs/api/errors/UNAUTHENTICATED) — No valid key or token was presented.
- [`PERMISSION_DENIED`](/docs/api/errors/PERMISSION_DENIED) — The key lacks the method's permission.
- [`RESOURCE_NOT_FOUND`](/docs/api/errors/RESOURCE_NOT_FOUND) — The named Resource does not exist or is not visible.
- [`INVALID_FIELD`](/docs/api/errors/INVALID_FIELD) — A field failed validation.
- [`RESOURCE_ALREADY_EXISTS`](/docs/api/errors/RESOURCE_ALREADY_EXISTS) — A Resource with this name exists.
- [`RATE_LIMITED`](/docs/api/errors/RATE_LIMITED) — The rate limit is reached; see Retry-After.
- [`SPEND_LIMIT_REACHED`](/docs/api/errors/SPEND_LIMIT_REACHED) — The org's spend limit is reached.

Every error arrives in the body [Errors](/docs/platform/errors) describes.

## Examples

**cURL**

```curl
curl -X POST "https://api.sylphx.com/v1/orgs/acme/projects/shop/envs/production/topics/topic:publish" \
  -H "Authorization: Bearer $SYLPHX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"events":[{"id":"…","source":"…","type":"…"}]}'
```

**TypeScript**

```ts
const response = await sylphx.events.topics.publish({ events: [{ id: '…', source: '…', type: '…' }], name: 'orgs/acme/projects/shop/envs/production/topics/topic' })
```

**Rust**

```rust
let mut req = sylphx::events::PublishEventsRequest::default();
req.events = vec![Default::default()];
req.name = "orgs/acme/projects/shop/envs/production/topics/topic".to_string();
let response = sx.events().topics().publish(req).await?;
```

**CLI**

```bash
sylphx events topics publish orgs/acme/projects/shop/envs/production/topics/topic
```

**MCP**

```json
{ "method_id": "events.topics.publish", "args": {"events":[{"id":"…","source":"…","type":"…"}],"name":"orgs/acme/projects/shop/envs/production/topics/topic"} }
```
