## Create a relay `client.MoQ.Relays.New(ctx, params) (*RelayNewResponse, error)` **post** `/accounts/{account_id}/moq/relays` Provisions a new MoQ relay instance. Auto-creates a publish+subscribe token and a subscribe-only token. Token values are included in the response (shown once). Config is set to defaults (upstreams off). Use PUT to modify. ### Parameters - `params RelayNewParams` - `AccountID param.Field[string]` Path param: Cloudflare account identifier. - `Name param.Field[string]` Body param: Human-readable name for the relay. ### Returns - `type RelayNewResponse struct{…}` Relay with its auto-created default token pair (one full-access [publish, subscribe] and one [subscribe]-only), each with its one-time secret, wrapped in the issuers envelope. - `Config RelayNewResponseConfig` - `Upstreams RelayNewResponseConfigUpstreams` Upstreams are external MOQT server publishers that a relay falls back to when it has no local publisher for a requested namespace/track. - `Enabled bool` - `Upstreams []RelayNewResponseConfigUpstreamsUpstream` Ordered list of upstream MOQT server publishers. Each entry is an object (not a bare string) so per-upstream configuration can be added in the future without another breaking change. - `URL string` Upstream MOQT server publisher URL. - `Created Time` - `Issuers []RelayNewResponseIssuer` Token collection (discriminated union on `type`). On create this holds the auto-created default pair, each including its one-time secret. - `CloudflareTokens []RelayNewResponseIssuersCloudflareToken` Always present ([] when empty). - `Created Time` - `Expires Time` Mandatory; no more than 1 year after `created`. - `Jti string` Token identity and registry key (32 hex chars). - `Operations []RelayNewResponseIssuersCloudflareTokensOperation` Signed allowlist of what the token may do. V1 coarse roles; the array form extends to fine-grained MoQT message names later without a breaking change. - `const RelayNewResponseIssuersCloudflareTokensOperationPublish RelayNewResponseIssuersCloudflareTokensOperation = "publish"` - `const RelayNewResponseIssuersCloudflareTokensOperationSubscribe RelayNewResponseIssuersCloudflareTokensOperation = "subscribe"` - `Label string` Optional, customer-set. - `Secret string` The signed JWT. Present ONLY in create / auto-create responses (shown once); never returned by list, never stored. - `Issuer RelayNewResponseIssuersIssuer` - `const RelayNewResponseIssuersIssuerCloudflare RelayNewResponseIssuersIssuer = "cloudflare"` - `Type RelayNewResponseIssuersType` - `const RelayNewResponseIssuersTypeCloudflareJWT RelayNewResponseIssuersType = "cloudflare_jwt"` - `Modified Time` - `Name string` - `UID string` Server-generated unique identifier (32 hex chars). ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/moq" "github.com/cloudflare/cloudflare-go/option" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) relay, err := client.MoQ.Relays.New(context.TODO(), moq.RelayNewParams{ AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), Name: cloudflare.F("Production Live Stream"), }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", relay.UID) } ``` #### Response ```json { "errors": [ { "code": 0, "message": "message" } ], "messages": [ { "code": 0, "message": "message" } ], "success": true, "result": { "config": { "upstreams": { "enabled": true, "upstreams": [ { "url": "url" } ] } }, "created": "2019-12-27T18:11:19.117Z", "issuers": [ { "cloudflare_tokens": [ { "created": "2019-12-27T18:11:19.117Z", "expires": "2019-12-27T18:11:19.117Z", "jti": "f3a1b2c3d4e5f67890a1b2c3d4e5f678", "operations": [ "publish", "subscribe" ], "label": "primary-encoder", "secret": "eyJhbGciOiJFZDI1NTE5..." } ], "issuer": "cloudflare", "type": "cloudflare_jwt" } ], "modified": "2019-12-27T18:11:19.117Z", "name": "Production Live Stream", "uid": "a1b2c3d4e5f67890a1b2c3d4e5f67890" } } ```