Documentation Index Fetch the complete documentation index at: https://docs.planasonix.com/llms.txt
Use this file to discover all available pages before exploring further.
These endpoints cover user profile , MFA , API keys , session policy , user preferences , organization settings , IP allowlists , log retention , organization metadata , and notification channels and rules .
Use Authorization: Bearer <api_key> or session-backed tokens as your deployment allows. Automation should prefer API keys; see Authentication .
Base URL
https://api.planasonix.com
Profile
Get profile
Response 200 OK
{
"data" : {
"id" : "usr_01jq8me" ,
"email" : "alex.morgan@example.com" ,
"display_name" : "Alex Morgan" ,
"timezone" : "America/Los_Angeles" ,
"locale" : "en-US" ,
"avatar_url" : "https://cdn.planasonix.com/avatars/usr_01jq8me.png" ,
"organization_id" : "org_01jq8acme" ,
"roles" : [ "admin" , "pipeline_editor" ]
}
}
Update profile
Request body
{
"display_name" : "Alex Morgan" ,
"timezone" : "America/Denver" ,
"locale" : "en-US"
}
Response 200 OK
{
"data" : {
"id" : "usr_01jq8me" ,
"email" : "alex.morgan@example.com" ,
"display_name" : "Alex Morgan" ,
"timezone" : "America/Denver" ,
"locale" : "en-US" ,
"updated_at" : "2025-03-27T15:00:00Z"
}
}
Change password
Request body
{
"current_password" : "hunter2-not-really" ,
"new_password" : "a-long-random-passphrase-from-your-manager"
}
Response 204 No Content
MFA
Get MFA status
Response 200 OK
{
"data" : {
"enabled" : true ,
"methods" : [ "totp" ],
"backup_codes_remaining" : 6
}
}
Enable MFA (start enrollment)
POST /api/user/mfa/enable
Request body
Response 200 OK
{
"data" : {
"method" : "totp" ,
"secret" : "JBSWY3DPEHPK3PXP" ,
"otpauth_uri" : "otpauth://totp/Planasonix:alex.morgan%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=Planasonix" ,
"enrollment_id" : "mfaenr_01jq801"
}
}
Verify MFA enrollment
POST /api/user/mfa/verify
Request body
{
"enrollment_id" : "mfaenr_01jq801" ,
"code" : "482193"
}
Response 200 OK
{
"data" : {
"enabled" : true ,
"backup_codes" : [
"1111-2222-33" ,
"4444-5555-66"
]
}
}
Disable MFA
POST /api/user/mfa/disable
Request body
{
"password" : "current-password-or-reauth-token" ,
"code" : "482193"
}
Response 204 No Content
API keys
List API keys
Response 200 OK
{
"data" : [
{
"id" : "key_01jq8ci" ,
"name" : "Airflow production" ,
"prefix" : "plnx_live_01jq" ,
"scopes" : [ "pipelines:read" , "pipelines:run" ],
"created_at" : "2025-01-15T10:00:00Z" ,
"last_used_at" : "2025-03-27T14:00:00Z" ,
"expires_at" : null
}
]
}
Create API key
Request body
{
"name" : "GitHub Actions deploy" ,
"scopes" : [ "pipelines:read" , "connections:read" ],
"expires_in_days" : 90
}
Response 201 Created
{
"data" : {
"id" : "key_01jq8new" ,
"name" : "GitHub Actions deploy" ,
"secret" : "plnx_live_01jq8fullsecretshownonce" ,
"prefix" : "plnx_live_01jq" ,
"scopes" : [ "pipelines:read" , "connections:read" ],
"expires_at" : "2025-06-25T15:00:00Z" ,
"created_at" : "2025-03-27T15:00:00Z"
}
}
GET /api/user/api-keys/{id}
Response 200 OK
{
"data" : {
"id" : "key_01jq8ci" ,
"name" : "Airflow production" ,
"prefix" : "plnx_live_01jq" ,
"scopes" : [ "pipelines:read" , "pipelines:run" ],
"created_at" : "2025-01-15T10:00:00Z" ,
"last_used_at" : "2025-03-27T14:00:00Z"
}
}
Delete API key
DELETE /api/user/api-keys/{id}
Response 204 No Content
Regenerate API key
POST /api/user/api-keys/{id}/regenerate
Response 200 OK
{
"data" : {
"id" : "key_01jq8ci" ,
"secret" : "plnx_live_01jq8newsecretshownonce" ,
"prefix" : "plnx_live_01jq" ,
"rotated_at" : "2025-03-27T15:05:00Z"
}
}
Session timeout
Get session timeout
Response 200 OK
{
"data" : {
"idle_timeout_minutes" : 60 ,
"absolute_timeout_minutes" : 1440 ,
"extend_on_activity" : true
}
}
Update session timeout
Request body
{
"idle_timeout_minutes" : 30 ,
"absolute_timeout_minutes" : 720 ,
"extend_on_activity" : true
}
Response 200 OK
{
"data" : {
"idle_timeout_minutes" : 30 ,
"absolute_timeout_minutes" : 720 ,
"extend_on_activity" : true ,
"updated_at" : "2025-03-27T15:06:00Z"
}
}
User preferences
List all preferences
GET /api/user-preferences
Response 200 OK
{
"data" : {
"canvas.snap_to_grid" : true ,
"canvas.show_minimap" : false ,
"notifications.email_digest" : "weekly"
}
}
Get one preference
GET /api/user-preferences/{key}
Response 200 OK
{
"data" : {
"key" : "canvas.snap_to_grid" ,
"value" : true ,
"updated_at" : "2025-03-10T09:00:00Z"
}
}
Set one preference
PUT /api/user-preferences/{key}
Request body
Response 200 OK
{
"data" : {
"key" : "canvas.snap_to_grid" ,
"value" : false ,
"updated_at" : "2025-03-27T15:07:00Z"
}
}
Organization settings
Get settings (partial)
Response 200 OK
{
"data" : {
"default_timezone" : "UTC" ,
"require_sso" : false ,
"data_residency" : "us"
}
}
Update settings
Request body
{
"default_timezone" : "America/New_York" ,
"require_sso" : true
}
Response 200 OK
{
"data" : {
"default_timezone" : "America/New_York" ,
"require_sso" : true ,
"updated_at" : "2025-03-27T15:08:00Z"
}
}
Get all settings
Response 200 OK
{
"data" : {
"default_timezone" : "America/New_York" ,
"require_sso" : true ,
"data_residency" : "us" ,
"feature_flags" : {
"lineage_v2" : true ,
"git_integration" : true
}
}
}
IP whitelist
List IP whitelist entries
GET /api/settings/ip-whitelist
Response 200 OK
{
"data" : [
{
"id" : "ipw_01jq801" ,
"cidr" : "203.0.113.0/24" ,
"label" : "Corporate egress" ,
"created_at" : "2025-02-01T12:00:00Z"
}
]
}
Add IP whitelist entry
POST /api/settings/ip-whitelist
Request body
{
"cidr" : "198.51.100.10/32" ,
"label" : "CI runner static IP"
}
Response 201 Created
{
"data" : {
"id" : "ipw_01jq802" ,
"cidr" : "198.51.100.10/32" ,
"label" : "CI runner static IP" ,
"created_at" : "2025-03-27T15:09:00Z"
}
}
Remove IP whitelist entry
DELETE /api/settings/ip-whitelist/{id}
Response 204 No Content
IP whitelist enforcement status
GET /api/settings/ip-whitelist/status
Response 200 OK
{
"data" : {
"enabled" : true ,
"applies_to" : [ "api" , "ui" ],
"entry_count" : 4 ,
"last_evaluated_at" : "2025-03-27T15:00:00Z"
}
}
Toggle IP whitelist
POST /api/settings/ip-whitelist/toggle
Request body
Response 200 OK
{
"data" : {
"enabled" : false ,
"updated_at" : "2025-03-27T15:10:00Z"
}
}
Log retention
Get log retention
GET /api/settings/log-retention
Response 200 OK
{
"data" : {
"run_logs_days" : 30 ,
"audit_logs_days" : 365 ,
"diagnostic_artifacts_days" : 7
}
}
Update log retention
PUT /api/settings/log-retention
Request body
{
"run_logs_days" : 14 ,
"diagnostic_artifacts_days" : 14
}
Response 200 OK
{
"data" : {
"run_logs_days" : 14 ,
"audit_logs_days" : 365 ,
"diagnostic_artifacts_days" : 14 ,
"updated_at" : "2025-03-27T15:11:00Z"
}
}
Organization and entitlements
Get organization
Response 200 OK
{
"data" : {
"id" : "org_01jq8acme" ,
"name" : "Acme Analytics" ,
"slug" : "acme-analytics" ,
"plan" : "enterprise" ,
"created_at" : "2024-06-01T00:00:00Z"
}
}
List enabled features
Response 200 OK
{
"data" : {
"features" : [
"lineage" ,
"git_integration" ,
"pipeline_agents" ,
"sso"
]
}
}
Feature limits
Response 200 OK
{
"data" : {
"max_pipelines" : 500 ,
"max_connections" : 200 ,
"max_concurrent_runs" : 25 ,
"max_agent_count" : 50
}
}
Subscription tier
Response 200 OK
{
"data" : {
"tier" : "enterprise" ,
"billing_period" : "annual" ,
"renewal_date" : "2026-06-01"
}
}
Notifications
List notification channels
GET /api/notifications/channels
Response 200 OK
{
"data" : [
{
"id" : "nch_01jq801" ,
"type" : "slack" ,
"name" : "#data-alerts" ,
"enabled" : true ,
"config" : {
"workspace" : "acme" ,
"channel" : "C01234567"
}
}
]
}
Create notification channel
POST /api/notifications/channels
Request body
{
"type" : "email" ,
"name" : "Data platform on-call" ,
"config" : {
"recipients" : [ "oncall@example.com" ],
"severity_filter" : [ "high" , "critical" ]
}
}
Response 201 Created
{
"data" : {
"id" : "nch_01jq802" ,
"type" : "email" ,
"name" : "Data platform on-call" ,
"enabled" : true ,
"created_at" : "2025-03-27T15:12:00Z"
}
}
Update notification channel
PUT /api/notifications/channels/{id}
Request body
{
"name" : "Data platform on-call (updated)" ,
"enabled" : false
}
Response 200 OK
{
"data" : {
"id" : "nch_01jq802" ,
"name" : "Data platform on-call (updated)" ,
"enabled" : false ,
"updated_at" : "2025-03-27T15:13:00Z"
}
}
Delete notification channel
DELETE /api/notifications/channels/{id}
Response 204 No Content
Test notification channel
POST /api/notifications/channels/{id}/test
Response 202 Accepted
{
"data" : {
"delivery_id" : "ndl_01jq8test" ,
"status" : "queued"
}
}
List notification rules
GET /api/notifications/rules
Response 200 OK
{
"data" : [
{
"id" : "nrl_01jq801" ,
"name" : "Pipeline failure to Slack" ,
"event" : "pipeline.run.failed" ,
"channel_ids" : [ "nch_01jq801" ],
"filters" : {
"pipeline_ids" : [ "pl_01hqxyz" ]
},
"enabled" : true
}
]
}
Create or replace notification rules
POST /api/notifications/rules
Request body
{
"name" : "DLQ growth alert" ,
"event" : "dlq.threshold_exceeded" ,
"channel_ids" : [ "nch_01jq802" ],
"filters" : {
"pipeline_ids" : [ "pl_01hqxyz" ],
"threshold" : 100
},
"enabled" : true
}
Response 201 Created
{
"data" : {
"id" : "nrl_01jq899" ,
"name" : "DLQ growth alert" ,
"event" : "dlq.threshold_exceeded" ,
"channel_ids" : [ "nch_01jq802" ],
"enabled" : true ,
"created_at" : "2025-03-27T15:14:00Z"
}
}
Profile Account fields in the UI.
API keys Creating and rotating keys in the product.
Notifications Channels and delivery behavior.
IP whitelisting Network restrictions for API and UI.