Link an organization secret to a project
PUThttps://api.spice.ai/v1/projects/{projectId}/org-secrets/{secretName}
Makes the named organization secret available to the project at deploy time. Linking a secret that is already linked changes nothing. The project's own secrets are not changed; a project secret with the same name takes precedence.
Authorizations
AuthorizationstringRequiredBearer <token>. Authentication lists the tokens it accepts.
Path parameters
projectIdintegerRequiredThe ID of the project
secretNamestringRequiredThe name of the organization secret
Header parameters
X-Org-NamestringThe organization to act on, by handle. Omit it to act on the organization the credential is bound to; sending it blank is a 400, not the same as omitting it. A user credential may name any organization its owner belongs to; a machine credential is pinned to its own. A portal session token is bound to none, so it must send this header on every route but
GET /v1/orgs(400org_assertion_requiredotherwise).- Pattern:
^[A-Za-z0-9._-]{1,255}$
- Pattern:
Responses
200The secret was already linkedapplication/json
idintegerUnique identifier for the secret
namestringName of the secret
valuestringAlways masked with asterisks
created_atstring (date-time)Timestamp when the secret was created
updated_atstring (date-time)Timestamp when the secret was last updated
201The secret was linkedapplication/json
idintegerUnique identifier for the secret
namestringName of the secret
valuestringAlways masked with asterisks
created_atstring (date-time)Timestamp when the secret was created
updated_atstring (date-time)Timestamp when the secret was last updated
400Invalid project ID or secret name
401Unauthorized
403Insufficient scope (requires secrets:write) or the viewer role
404Project or organization secret not found
409The project already links the maximum of 1000 organization secrets (code: org_secret_link_limit)
429Another link change is in progress for this project. Try again.
500Internal server error
503Failed to link the organization secret. Try again.
curl -X PUT "https://api.spice.ai/v1/projects/<projectId>/org-secrets/<secretName>" \
-H "Authorization: Bearer <token>"PUT /v1/projects/<projectId>/org-secrets/<secretName> HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>{
"id": 0,
"name": "string",
"value": "string",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}application/json
{
"id": 0,
"name": "string",
"value": "string",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}application/json
No response body
No response body
No response body
No response body
No response body
No response body
No response body
No response body
PUThttps://api.spice.ai/v1/orgs/{orgId}/projects/{projectId}/org-secrets/{secretName}
The org is orgId in the path. Makes the named organization secret available to the project at deploy time. Linking a secret that is already linked changes nothing. The project's own secrets are not changed; a project secret with the same name takes precedence.
Authorizations
AuthorizationstringRequiredBearer <token>. Authentication lists the tokens it accepts.
Path parameters
orgIdintegerRequiredThe org id from GET /v1/orgs
- Minimum:
1
- Minimum:
projectIdintegerRequiredThe ID of the project
secretNamestringRequiredThe name of the organization secret
Header parameters
X-Org-NamestringWhen present, X-Org-Name must name the same org as orgId. Otherwise the request returns org_path_mismatch (400).
- Pattern:
^[A-Za-z0-9._-]{1,255}$
- Pattern:
Responses
200The secret was already linkedapplication/json
idintegerUnique identifier for the secret
namestringName of the secret
valuestringAlways masked with asterisks
created_atstring (date-time)Timestamp when the secret was created
updated_atstring (date-time)Timestamp when the secret was last updated
201The secret was linkedapplication/json
idintegerUnique identifier for the secret
namestringName of the secret
valuestringAlways masked with asterisks
created_atstring (date-time)Timestamp when the secret was created
updated_atstring (date-time)Timestamp when the secret was last updated
400Bad Request
Invalid project ID or secret name. orgId is not a valid org id (invalid_org_id), or X-Org-Name does not name that org (org_path_mismatch).
401Unauthorized
403Forbidden
Insufficient scope (requires secrets:write) or the viewer role. The caller is not a member of the org (org_forbidden). A machine credential named a different org (org_assertion_mismatch). The org is deleted (org_deleted).
404Project or organization secret not found
409The project already links the maximum of 1000 organization secrets (code: org_secret_link_limit)
429Another link change is in progress for this project. Try again.
500Internal server error
503Failed to link the organization secret. Try again.
curl -X PUT "https://api.spice.ai/v1/orgs/<orgId>/projects/<projectId>/org-secrets/<secretName>" \
-H "Authorization: Bearer <token>"PUT /v1/orgs/<orgId>/projects/<projectId>/org-secrets/<secretName> HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>{
"id": 0,
"name": "string",
"value": "string",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}application/json
{
"id": 0,
"name": "string",
"value": "string",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}application/json
No response body
No response body
No response body
No response body
No response body
No response body
No response body
No response body
PUThttps://api.spice.ai/v1/apps/{appId}/org-secrets/{secretName}Deprecated
Legacy alias of /v1/projects/{projectId}/org-secrets/{secretName} — projects were previously called apps. Makes the named organization secret available to the project at deploy time. Linking a secret that is already linked changes nothing. The project's own secrets are not changed; a project secret with the same name takes precedence.
Authorizations
AuthorizationstringRequiredBearer <token>. Authentication lists the tokens it accepts.
Path parameters
appIdintegerRequiredThe ID of the project
secretNamestringRequiredThe name of the organization secret
Header parameters
X-Org-NamestringThe organization to act on, by handle. Omit it to act on the organization the credential is bound to; sending it blank is a 400, not the same as omitting it. A user credential may name any organization its owner belongs to; a machine credential is pinned to its own. A portal session token is bound to none, so it must send this header on every route but
GET /v1/orgs(400org_assertion_requiredotherwise).- Pattern:
^[A-Za-z0-9._-]{1,255}$
- Pattern:
Responses
200The secret was already linkedapplication/json
idintegerUnique identifier for the secret
namestringName of the secret
valuestringAlways masked with asterisks
created_atstring (date-time)Timestamp when the secret was created
updated_atstring (date-time)Timestamp when the secret was last updated
201The secret was linkedapplication/json
idintegerUnique identifier for the secret
namestringName of the secret
valuestringAlways masked with asterisks
created_atstring (date-time)Timestamp when the secret was created
updated_atstring (date-time)Timestamp when the secret was last updated
400Invalid project ID or secret name
401Unauthorized
403Insufficient scope (requires secrets:write) or the viewer role
404Project or organization secret not found
409The project already links the maximum of 1000 organization secrets (code: org_secret_link_limit)
429Another link change is in progress for this project. Try again.
500Internal server error
503Failed to link the organization secret. Try again.
OpenAPIapi.spice.ai/openapi.json
curl -X PUT "https://api.spice.ai/v1/apps/<appId>/org-secrets/<secretName>" \
-H "Authorization: Bearer <token>"PUT /v1/apps/<appId>/org-secrets/<secretName> HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>{
"id": 0,
"name": "string",
"value": "string",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}application/json
{
"id": 0,
"name": "string",
"value": "string",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}application/json
No response body
No response body
No response body
No response body
No response body
No response body
No response body
No response body