{"openapi":"3.1.0","info":{"title":"TaskPrio API","version":"0.3.0","description":"Agent-native task queue. One global priority order; agents call /api/next, get the highest-ranked task with full context, work it, report via /complete. Most endpoints require Bearer token (Account → Copy token).","contact":{"name":"TaskPrio","url":"https://taskprio.com"},"license":{"name":"Proprietary","url":"https://taskprio.com/terms"}},"servers":[{"url":"https://promptprio.com","description":"Production"}],"tags":[{"name":"Tasks","description":"Create, read, rank, schedule, complete, archive"},{"name":"Projects","description":"Project + project-settings (cwd, agent context)"},{"name":"Organisations","description":"Org-level grouping above projects"},{"name":"SelectLists","description":"User-defined single-select property lists (Stage / Energy / etc)"},{"name":"Auth","description":"Sign-in + token management"},{"name":"Billing","description":"Stripe checkout + portal"},{"name":"Meta","description":"OpenAPI · llms.txt · IndexNow ping"}],"paths":{"/":{"get":{"tags":["Meta"],"summary":"API descriptor","responses":{"200":{"description":"JSON descriptor"}}}},"/llms.txt":{"get":{"tags":["Meta"],"summary":"LLM-friendly site summary + priority URLs","responses":{"200":{"description":"text/plain"}}}},"/api/openapi.json":{"get":{"tags":["Meta"],"summary":"This spec","responses":{"200":{"description":"OpenAPI 3.1 JSON"}}}},"/api/indexnow-ping":{"get":{"tags":["Meta"],"summary":"Push canonical URLs to IndexNow (Bing/Yandex/Seznam/Naver). Auto-fires daily 06:00 UTC.","responses":{"200":{"description":"Push result"}}}},"/api/auth/google":{"get":{"tags":["Auth"],"summary":"Begin Google OAuth sign-in","responses":{"302":{"description":"Redirect to Google"}}}},"/api/auth/callback":{"get":{"tags":["Auth"],"summary":"Google OAuth callback (browser-only)","responses":{"302":{"description":"Redirect to /"}}}},"/api/auth/me":{"get":{"tags":["Auth"],"security":[{"bearer":[]}],"summary":"Current user","responses":{"200":{"description":"user object","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/User"}}}}}}}}},"/api/auth/logout":{"post":{"tags":["Auth"],"summary":"Clear session cookie","responses":{"200":{"description":"ok"}}}},"/api/auth/token/rotate":{"post":{"tags":["Auth"],"security":[{"bearer":[]}],"summary":"Rotate the agent token; old token stops working immediately","responses":{"200":{"description":"new token","content":{"application/json":{"schema":{"type":"object","properties":{"apiToken":{"type":"string"}}}}}}}}},"/api/billing/checkout":{"post":{"tags":["Billing"],"security":[{"bearer":[]}],"summary":"Start Stripe Checkout for Pro upgrade","responses":{"200":{"description":"checkout url"}}}},"/api/billing/portal":{"post":{"tags":["Billing"],"security":[{"bearer":[]}],"summary":"Open Stripe customer portal (manage subscription / payment method)","responses":{"200":{"description":"portal url"}}}},"/api/billing/webhook":{"post":{"tags":["Billing"],"summary":"Stripe webhook (server-only)","responses":{"200":{"description":"ack"}}}},"/api/next":{"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Pull the highest-priority unblocked task and lease it for 15 minutes (auto-reaped on expiry, so an interrupted agent never strands a task). Returns the task + merged context (project cwd + agent-context + subtasks + attachments).","parameters":[{"name":"agent","in":"query","schema":{"type":"string"},"description":"Optional agent identifier shown on the leased card. MCP clients auto-fill it with the tool name (claude-code / cursor / zed / ...); REST clients can pass e.g. chatgpt for per-agent attribution when several LLMs share one queue"},{"name":"project","in":"query","schema":{"type":"string"},"description":"Scope to a single project id"},{"name":"exclude","in":"query","schema":{"type":"string"},"description":"Comma-separated project ids to skip (e.g. employer/personal) — for fleet agents that work everything except a few projects"},{"name":"cwd","in":"query","schema":{"type":"string"},"description":"Agent's working directory — auto-scopes to the project whose workingDir contains it, or that organisation when cwd is a parent of one org's project repos (no explicit project needed)"},{"name":"count","in":"query","schema":{"type":"integer"},"description":"Return up to N next tasks instead of one (look-ahead; does NOT lease)"}],"responses":{"200":{"description":"next task + context (or 204 if queue empty)","content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"},"priority":{"type":"integer"},"context":{"type":"string"}}}}}}}}},"/api/board":{"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Full board snapshot (projects + organisations + teams + non-terminal tasks)","responses":{"200":{"description":"board","content":{"application/json":{"schema":{"type":"object","properties":{"tasks":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"organisations":{"type":"array","items":{"$ref":"#/components/schemas/Organisation"}},"teams":{"type":"array","items":{"$ref":"#/components/schemas/Team"}},"selectLists":{"type":"array","items":{"$ref":"#/components/schemas/SelectList"}}}}}}}}}},"/api/changes":{"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Polling change-feed: tasks updated since ?since=<epoch-ms> (any status, oldest-first, capped 200). Pass the returned `now` back as the next `since`. Lightweight delta alternative to GET /api/board for live updates (push variant: webhooks).","responses":{"200":{"description":"{ tasks, now }"}}}},"/api/webhooks":{"get":{"tags":["Webhooks"],"security":[{"bearer":[]}],"summary":"List webhooks (signing secret masked)","responses":{"200":{"description":"webhooks array"}}},"post":{"tags":["Webhooks"],"security":[{"bearer":[]}],"summary":"Subscribe a webhook. url must be https + non-private (SSRF-guarded). Deliveries are HMAC-SHA256 signed via the X-PromptPrio-Signature: sha256=<hex> header. The full secret is returned only here, once. events defaults to [\"*\"]; valid: task.created/updated/completed/deleted.","responses":{"201":{"description":"created webhook (includes secret)"}}}},"/api/webhooks/{id}":{"delete":{"tags":["Webhooks"],"security":[{"bearer":[]}],"summary":"Delete a webhook","responses":{"200":{"description":"ok"}}}},"/api/tasks":{"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"List ranked tasks (top 50 by default — a survey, not the firehose).","parameters":[{"name":"project","in":"query","schema":{"type":"string"},"description":"Filter to a project (id or name)"},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer"},"description":"Max tasks (default 50). 0 or ?all returns everything."},{"name":"all","in":"query","schema":{"type":"boolean"},"description":"Return all tasks, uncapped"}],"responses":{"200":{"description":"task array"}}},"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Create a task","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string"},"body":{"type":"string"},"projectId":{"type":"string","nullable":true},"assignee":{"type":"string","enum":["any","llm","human"]},"place":{"type":"string","enum":["top","bottom","inbox"]},"scheduledFor":{"type":"integer","description":"Epoch ms"},"kind":{"type":"string","enum":["task","divider","reference"]},"subtasks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"done":{"type":"boolean"}}}}}}}}},"responses":{"201":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}}},"/api/tasks/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Get one task","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}},"404":{"description":"Not found"}}},"patch":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Update fields (title, body, assignee, projectId, scheduledFor, subtasks, attachments, selectValues)","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}},"delete":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Soft-delete (moves to trash, recoverable via /restore)","responses":{"200":{"description":"ok"}}}},"/api/tasks/{id}/triage":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Rank an Inbox task into the queue","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"place":{"type":"string","enum":["top","bottom"]}}}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}}},"/api/tasks/{id}/reprioritize":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Move a task before / after another ranked task (or top / bottom)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"beforeId":{"type":"string"},"afterId":{"type":"string"},"top":{"type":"boolean"}}}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}}},"/api/tasks/{id}/schedule":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Schedule a task for future activation","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["scheduledFor"],"properties":{"scheduledFor":{"type":"integer","description":"Epoch ms"},"targetPriority":{"type":"integer","nullable":true}}}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}}},"/api/tasks/{id}/start":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Explicitly start (lease) a task without going through /next","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}}},"/api/tasks/{id}/complete":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Complete a task (result required). Clears the lease and marks status=done.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["result"],"properties":{"result":{"type":"string","description":"What the agent did + outcome"}}}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}},"402":{"description":"Free tier daily completion cap hit"}}}},"/api/tasks/{id}/needs-human":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Flag a task as needing human input. Clears the lease, sets status=needs_human, stores the question in result.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"question":{"type":"string"}}}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}}},"/api/tasks/{id}/restore":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Restore a done/trashed task to the Inbox","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/Task"}}}}}}}}},"/api/tasks/{id}/purge":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Permanently delete a task (cannot be undone)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"ok"}}}},"/api/search":{"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Full-text search title/body/result/subtasks/attachments. Every query word must match (AND). Top 50 by default.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer"},"description":"Max results (default 50). 0 or ?all for everything."},{"name":"all","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"matching tasks"}}}},"/api/archive":{"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Done + trashed tasks (recoverable)","responses":{"200":{"description":"archive"}}}},"/api/export":{"get":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Full board export (JSON, all tasks + projects + orgs)","responses":{"200":{"description":"JSON dump"}}}},"/api/upload":{"post":{"tags":["Tasks"],"security":[{"bearer":[]}],"summary":"Upload a file attachment (returns URL for task.attachments)","responses":{"200":{"description":"{url, type, size}"}}}},"/api/projects":{"get":{"tags":["Projects"],"security":[{"bearer":[]}],"summary":"List projects","responses":{"200":{"description":"projects"}}},"post":{"tags":["Projects"],"security":[{"bearer":[]}],"summary":"Create a project","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"organisationId":{"type":"string"},"cwd":{"type":"string"},"agentContext":{"type":"string"}}}}}},"responses":{"201":{"description":"created"}}}},"/api/projects/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"tags":["Projects"],"security":[{"bearer":[]}],"summary":"Update name, cwd, agentContext, organisationId, teamId","responses":{"200":{"description":"ok"}}},"delete":{"tags":["Projects"],"security":[{"bearer":[]}],"summary":"Delete a project (its tasks move to No-project)","responses":{"200":{"description":"ok"}}}},"/api/projects/{id}/public":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Projects"],"security":[{"bearer":[]}],"summary":"Toggle the project's public read-only board (T3.3). Mints a durable share token on first enable.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["public"],"properties":{"public":{"type":"boolean"}}}}}},"responses":{"200":{"description":"{ public, shareToken, url }"}}}},"/api/public/feed":{"get":{"tags":["Projects"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":40}}],"summary":"PUBLIC (no auth): fleet activity feed — recent task completions across all public boards, newest-first. Sanitized (titles + project + agent + time + board token). Empty until an operator opts a board public.","responses":{"200":{"description":"{ items, boards, generatedAt }"}}}},"/api/public/{token}":{"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Projects"],"summary":"PUBLIC (no auth): read-only board by share token. 404 unless the project is public. Sanitized — task titles, status, assignee, agent, timestamps only; never bodies, results, structured-context, or secrets.","responses":{"200":{"description":"{ project, generatedAt, counts, tasks }"},"404":{"description":"not found / not public"}}}},"/api/projects/reorder":{"post":{"tags":["Projects"],"security":[{"bearer":[]}],"summary":"Reorder projects within their org","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"order":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"ok"}}}},"/api/organisations":{"get":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"List organisations","responses":{"200":{"description":"orgs"}}},"post":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Create org","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"color":{"type":"string"}}}}}},"responses":{"201":{"description":"created"}}}},"/api/organisations/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Update name / color","responses":{"200":{"description":"ok"}}},"delete":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Delete org (its projects move to a fallback org)","responses":{"200":{"description":"ok"}}}},"/api/organisations/reorder":{"post":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Reorder organisations","responses":{"200":{"description":"ok"}}}},"/api/teams":{"get":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"List teams (groups of projects inside an organisation)","responses":{"200":{"description":"teams"}}},"post":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Create a team in an organisation","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["organisationId","name"],"properties":{"organisationId":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"}}}}}},"responses":{"201":{"description":"created"}}}},"/api/teams/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Update team name / color","responses":{"200":{"description":"ok"}}},"delete":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Delete team (its projects stay in the org, teamId cleared)","responses":{"200":{"description":"ok"}}}},"/api/teams/reorder":{"post":{"tags":["Organisations"],"security":[{"bearer":[]}],"summary":"Reorder teams within an organisation","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"organisationId":{"type":"string"},"order":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"ok"}}}},"/api/select-lists":{"get":{"tags":["SelectLists"],"security":[{"bearer":[]}],"summary":"List user-defined property lists","responses":{"200":{"description":"lists"}}},"post":{"tags":["SelectLists"],"security":[{"bearer":[]}],"summary":"Create a property list (e.g. Stage / Energy)","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}}}}},"responses":{"201":{"description":"created"}}}},"/api/select-lists/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"tags":["SelectLists"],"security":[{"bearer":[]}],"summary":"Rename a property list","responses":{"200":{"description":"ok"}}},"delete":{"tags":["SelectLists"],"security":[{"bearer":[]}],"summary":"Delete a property list (cleared from every task that had it set)","responses":{"200":{"description":"ok"}}}},"/api/select-lists/{id}/options":{"post":{"tags":["SelectLists"],"security":[{"bearer":[]}],"summary":"Add an option to a property list","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["label"],"properties":{"label":{"type":"string"},"color":{"type":"string"}}}}}},"responses":{"201":{"description":"created"}}}},"/api/select-lists/{id}/options/{optionId}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"optionId","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"tags":["SelectLists"],"security":[{"bearer":[]}],"summary":"Rename / recolor a property option","responses":{"200":{"description":"ok"}}},"delete":{"tags":["SelectLists"],"security":[{"bearer":[]}],"summary":"Delete a property option","responses":{"200":{"description":"ok"}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Use the API token from Account → Copy token. Prefix: `pp_`. Treat as a password."}},"schemas":{"User":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"plan":{"type":"string","enum":["free","pro"]},"apiToken":{"type":"string","description":"Only returned to the owner; treat as a secret."},"handle":{"type":"string","nullable":true,"description":"Public @handle for the opt-in operator profile."},"publicProfile":{"type":"boolean","description":"When true, GET /api/u/<handle> serves this user's aggregate stats publicly."}}},"Task":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"body":{"type":"string","description":"Markdown · the prompt or details the agent reads"},"rank":{"type":"string","description":"Opaque fractional-index key; use /reprioritize, never edit directly"},"ranked":{"type":"boolean","description":"false = Inbox; true = lives in the priority queue"},"projectId":{"type":"string","nullable":true},"assignee":{"type":"string","enum":["any","llm","human"],"description":"any=either you or your agent · llm=agent only · human=you only"},"status":{"type":"string","enum":["inbox","active","in_progress","needs_human","scheduled","done","trashed","archived"]},"scheduledFor":{"type":"integer","nullable":true,"description":"Epoch ms · future activation time"},"subtasks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"done":{"type":"boolean"}}}},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"type":{"type":"string"},"size":{"type":"integer"}}}},"selectValues":{"type":"object","additionalProperties":{"type":"string"},"description":"listId -> optionId · single-select properties"},"result":{"type":"string","nullable":true,"description":"Filled by /complete (agent's outcome) or /needs-human (the question)"},"leasedBy":{"type":"string","nullable":true,"description":"Agent identifier currently holding the lease"},"leaseExpiresAt":{"type":"integer","nullable":true,"description":"Epoch ms · 5min default"},"createdAt":{"type":"integer"},"updatedAt":{"type":"integer"},"kind":{"type":"string","enum":["task","divider","reference"],"description":"divider = section header (not actionable); reference = pinned doc/anchor humans read but agents are never served as work"}}},"Project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"organisationId":{"type":"string","nullable":true},"teamId":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true,"description":"DATA cockpit: project's primary domain, links to fleet metrics"},"goals":{"type":"object","nullable":true,"additionalProperties":{"type":"number"},"description":"DATA cockpit: per-project goal overrides (metric→target), merged on PATCH"},"position":{"type":"number"},"cwd":{"type":"string","description":"Optional working directory hint for agents"},"agentContext":{"type":"string","description":"Optional shared prompt context appended to every task in this project"}}},"Organisation":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"},"position":{"type":"number"}}},"Team":{"type":"object","properties":{"id":{"type":"string"},"organisationId":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"},"position":{"type":"number"}}},"SelectList":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"position":{"type":"number"},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"color":{"type":"string"}}}}}}}}}