{"openapi":"3.1.0","info":{"title":"WonderFonT API","description":"Versioned contract v1. Auth: `Authorization: Bearer wf_<prefix>_<secret>`. Errors: {error: {code, message, request_id}}. Guide: /api/v1/docs.","version":"1.0.0"},"paths":{"/api/v1/catalog/families":{"get":{"tags":["catalog"],"summary":"Catalog List","description":"Published families. Search is deterministic (no model). `limit` max 100 here.","operationId":"catalog_list_wf_api_v1_catalog_families_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"script","in":"query","required":false,"schema":{"enum":["he","latin","both",""],"type":"string","default":"","title":"Script"}},{"name":"classification","in":"query","required":false,"schema":{"type":"string","default":"","title":"Classification"}},{"name":"variable","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Variable"}},{"name":"use","in":"query","required":false,"schema":{"type":"string","default":"","title":"Use"}},{"name":"sort","in":"query","required":false,"schema":{"enum":["new","name","curated",""],"type":"string","default":"","title":"Sort"}},{"name":"locale","in":"query","required":false,"schema":{"enum":["en","he"],"type":"string","default":"en","title":"Locale"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/families/{slug}":{"get":{"tags":["catalog"],"summary":"Catalog Family","description":"One published family, its pairings and its license requirements.","operationId":"catalog_family_wf_api_v1_catalog_families__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"locale","in":"query","required":false,"schema":{"enum":["en","he"],"type":"string","default":"en","title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pricing":{"get":{"tags":["catalog"],"summary":"Pricing","description":"What is sold. Desktop and web licenses are priced per family (GET\n/catalog/families/{slug}, `license`); the web library covers every family\nfor 10, 50 or 100 sites, listed only while it is on sale. `license` names\nthe versions a purchase must accept.","operationId":"pricing_wf_api_v1_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/families/{slug}/styles":{"get":{"tags":["catalog"],"summary":"Catalog Styles","operationId":"catalog_styles_wf_api_v1_catalog_families__slug__styles_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/families/{slug}/coverage":{"get":{"tags":["catalog"],"summary":"Catalog Coverage","description":"Letters the web files map ([mapped, of]); `checked` false when the files are not readable here.","operationId":"catalog_coverage_wf_api_v1_catalog_families__slug__coverage_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/families/{slug}/pairings":{"get":{"tags":["catalog"],"summary":"Catalog Pairings","description":"Rule-based pairings (the family page's list).","operationId":"catalog_pairings_wf_api_v1_catalog_families__slug__pairings_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"locale","in":"query","required":false,"schema":{"enum":["en","he"],"type":"string","default":"en","title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/recommend":{"post":{"tags":["catalog"],"summary":"Catalog Recommend","description":"A ranked shortlist for a brief, each family with verified and editorial\nreasons. With a key (licenses:read) every family also says what the workspace\nalready owns for desktop and web, and the price of what is missing. No model.","operationId":"catalog_recommend_wf_api_v1_catalog_recommend_post","parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/families/{slug}/preview":{"post":{"tags":["catalog"],"summary":"Catalog Preview","description":"Your own text drawn with the family's real web files (PNG, base64), per style,\nand every character it cannot draw. The text is not stored or logged. A preview\nis not a license or a download.","operationId":"catalog_preview_wf_api_v1_catalog_families__slug__preview_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/access":{"get":{"tags":["licenses"],"summary":"Access","description":"For each family slug (comma separated, up to 20): desktop and web rights the\nworkspace holds now, which grant gives them, free site capacity, and the price of\nwhat is missing. Desktop rights never come from the web library.","operationId":"access_wf_api_v1_workspaces__workspace_id__access_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"families","in":"query","required":true,"schema":{"type":"string","maxLength":2000,"title":"Families"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/subscription":{"get":{"tags":["licenses"],"summary":"Subscription","description":"The web library subscription: plan, status, paid-through, grace, a scheduled\nchange, a cancellation date, and its site use. null when there is none.","operationId":"subscription_wf_api_v1_workspaces__workspace_id__subscription_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/orders":{"get":{"tags":["billing"],"summary":"Orders","description":"Paid orders, newest first, with refunds and the receipt page. Owners only, as\non the website (receipts live under Settings).","operationId":"orders_wf_api_v1_workspaces__workspace_id__orders_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signup":{"post":{"tags":["connect"],"summary":"Signup","description":"Owner 09-24: an agent opens an account. It sends an address; the address gets\na 6-digit code (15 minutes, one use). The answer is the same whatever happened,\nso this never tells who has an account.","operationId":"signup_wf_api_v1_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupIn"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signup/verify":{"post":{"tags":["connect"],"summary":"Signup Verify","description":"The code from the mail: the account (created if new), its personal\nworkspace, and an API key with every scope, returned once. The key acts as the\naccount's owner, payments included (it may accept the license for its\npurchases). Five wrong codes end that code.","operationId":"signup_verify_wf_api_v1_signup_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupVerifyIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connect":{"post":{"tags":["connect"],"summary":"Connect","description":"Start a connection. Show `verification_url` (or `code`) to your human;\npoll `GET /connect/{code}` with header `X-Connect-Secret: <secret>`.\n`storefront` (en, the default, or he) picks the site whose account approves: the\nHebrew site (wonderfont.art/he) and the English site (wonderfont.art) are separate\naccounts. `verification_urls` has both, for a human who is not sure which they use.","operationId":"connect_wf_api_v1_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connect/{code}":{"get":{"tags":["connect"],"summary":"Connect Status","description":"pending | granted | denied | expired. With the right X-Connect-Secret,\na granted connection returns `api_key` exactly once.","operationId":"connect_status_wf_api_v1_connect__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account":{"get":{"tags":["account"],"summary":"Account","operationId":"account_wf_api_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/account/sessions":{"get":{"tags":["account"],"summary":"Sessions","operationId":"sessions_wf_api_v1_account_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/account/sessions/{session_id}":{"delete":{"tags":["account"],"summary":"Session Revoke","operationId":"session_revoke_wf_api_v1_account_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces":{"get":{"tags":["account"],"summary":"Workspaces","operationId":"workspaces_wf_api_v1_workspaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/account/favorites":{"get":{"tags":["collections"],"summary":"Favorites","operationId":"favorites_wf_api_v1_account_favorites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/account/favorites/{family}":{"put":{"tags":["collections"],"summary":"Favorite On","operationId":"favorite_on_wf_api_v1_account_favorites__family__put","parameters":[{"name":"family","in":"path","required":true,"schema":{"type":"string","title":"Family"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["collections"],"summary":"Favorite Off","operationId":"favorite_off_wf_api_v1_account_favorites__family__delete","parameters":[{"name":"family","in":"path","required":true,"schema":{"type":"string","title":"Family"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/collections":{"get":{"tags":["collections"],"summary":"Collections","operationId":"collections_wf_api_v1_workspaces__workspace_id__collections_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["collections"],"summary":"Collection Create","operationId":"collection_create_wf_api_v1_workspaces__workspace_id__collections_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/collections/{collection_id}":{"get":{"tags":["collections"],"summary":"Collection","operationId":"collection_wf_api_v1_workspaces__workspace_id__collections__collection_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"collection_id","in":"path","required":true,"schema":{"type":"string","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/collections/{collection_id}/{action}":{"post":{"tags":["collections"],"summary":"Collection Act","description":"rename {name, version} · delete · share · revoke · add {family, sample_text?} · remove {family}.","operationId":"collection_act_wf_api_v1_workspaces__workspace_id__collections__collection_id___action__post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"collection_id","in":"path","required":true,"schema":{"type":"string","title":"Collection Id"}},{"name":"action","in":"path","required":true,"schema":{"enum":["rename","delete","share","revoke","add","remove"],"type":"string","title":"Action"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/licenses":{"get":{"tags":["licenses"],"summary":"Licenses","description":"The workspace's live grants (licensing v2): what each one is, what it\nallows, its site use, the published releases it covers, and which file\nkinds it downloads. No seats: every member uses what the workspace owns.","operationId":"licenses_wf_api_v1_workspaces__workspace_id__licenses_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/downloads":{"post":{"tags":["licenses"],"summary":"Download","description":"A signed download link (24 h), only when wf_policy allows that kind:\n`desktop` (the default) needs a desktop license, `web` (self-host files)\nan earlier license that included them, `all` both. A web-only license\nanswers 402 no_entitlement with next_action buy_desktop. One wf_downloads\nrow per link issued (wf_downloads.issue).","operationId":"download_wf_api_v1_workspaces__workspace_id__downloads_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/team":{"get":{"tags":["team"],"summary":"Team","description":"Members, invitations, business-domain claims and (owners) member requests.","operationId":"team_wf_api_v1_workspaces__workspace_id__team_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/team/{action}":{"post":{"tags":["team"],"summary":"Team Act","description":"The team page's actions (wf_workspace.act), same rules: owners manage.","operationId":"team_act_wf_api_v1_workspaces__workspace_id__team__action__post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"action","in":"path","required":true,"schema":{"enum":["rename","invite","revoke_invite","remove","leave","role","transfer","domain_claim","domain_verify","domain_autojoin","domain_revoke"],"type":"string","title":"Action"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/quotes":{"post":{"tags":["billing"],"summary":"Quote Create","description":"A priced quote (owners, 15 min) or a request for the owner (members, 7 days).\nAmounts come from the price book, never from the caller.","operationId":"quote_create_wf_api_v1_workspaces__workspace_id__quotes_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/quotes/{quote_id}":{"get":{"tags":["billing"],"summary":"Quote Status","operationId":"quote_status_wf_api_v1_workspaces__workspace_id__quotes__quote_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"quote_id","in":"path","required":true,"schema":{"type":"string","title":"Quote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/quotes/{quote_id}/approve":{"post":{"tags":["billing"],"summary":"Quote Approve","description":"An owner turns a member's request into a fresh owner quote. Needs\nbilling:execute and an owner. Approving a purchase is accepting its license:\nit needs `accept` from the owner signed in; an API key cannot approve one\n(license_not_accepted: the owner approves on the website).","operationId":"quote_approve_wf_api_v1_workspaces__workspace_id__quotes__quote_id__approve_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"quote_id","in":"path","required":true,"schema":{"type":"string","title":"Quote Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ApproveIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/quotes/{quote_id}/execute":{"post":{"tags":["billing"],"summary":"Quote Execute","description":"Pay or apply an open owner quote. A key needs billing:execute (owner 09-24:\nit pays as its owner, no spending limit). A key that still holds a spending\ngrant from before stays inside it: the amount is reserved atomically before\nthe provider call and given back if it fails. A new payment answers\n`user_action_required` with the provider's continuation URL. A quote that\nneeds the license accepted and has no acceptance answers\n`license_not_accepted` with the checkout page where the owner accepts it;\na signed-in owner may send `accept` here instead. Nothing reaches the\nprovider before that.","operationId":"quote_execute_wf_api_v1_workspaces__workspace_id__quotes__quote_id__execute_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"quote_id","in":"path","required":true,"schema":{"type":"string","title":"Quote Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ApproveIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/grants":{"get":{"tags":["grants"],"summary":"Grants","operationId":"grants_wf_api_v1_workspaces__workspace_id__grants_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["grants"],"summary":"Grant Create","description":"Owners only, signed in (browser session): a key cannot delegate to itself.","operationId":"grant_create_wf_api_v1_workspaces__workspace_id__grants_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/grants/{grant_id}":{"delete":{"tags":["grants"],"summary":"Grant Revoke","operationId":"grant_revoke_wf_api_v1_workspaces__workspace_id__grants__grant_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"grant_id","in":"path","required":true,"schema":{"type":"string","title":"Grant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/keys":{"get":{"tags":["keys"],"summary":"Keys","operationId":"keys_wf_api_v1_workspaces__workspace_id__keys_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["keys"],"summary":"Key Create","description":"Signed-in people only (a key cannot mint keys). The key is in this response once.","operationId":"key_create_wf_api_v1_workspaces__workspace_id__keys_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/keys/{key_id}":{"delete":{"tags":["keys"],"summary":"Key Revoke","operationId":"key_revoke_wf_api_v1_workspaces__workspace_id__keys__key_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites":{"get":{"tags":["sites"],"summary":"Sites","description":"The workspace's sites (removed ones for 90 days), only those the key may see.","operationId":"sites_wf_api_v1_workspaces__workspace_id__sites_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sites"],"summary":"Site Register","description":"Takes a slot on a license at once (402 `site_limit` when none is free,\nexactly as the Sites page). The site is `pending` until verified. A key\nlimited to named sites cannot add one.","operationId":"site_register_wf_api_v1_workspaces__workspace_id__sites_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}":{"get":{"tags":["sites"],"summary":"Site Get","description":"State, hosts, verification instructions, embed, health, the live mapping and available updates.","operationId":"site_get_wf_api_v1_workspaces__workspace_id__sites__site_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sites"],"summary":"Site Remove","description":"Frees the slot; the stylesheet stops serving from the next request.","operationId":"site_remove_wf_api_v1_workspaces__workspace_id__sites__site_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/verify":{"post":{"tags":["sites"],"summary":"Site Verify","description":"Check the DNS TXT record, the meta tag or the embed now; `active` on proof.","operationId":"site_verify_wf_api_v1_workspaces__workspace_id__sites__site_id__verify_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/replace":{"post":{"tags":["sites"],"summary":"Site Replace","description":"Same slot, new address. An active site proves the new address first.","operationId":"site_replace_wf_api_v1_workspaces__workspace_id__sites__site_id__replace_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/health":{"get":{"tags":["sites"],"summary":"Site Health","description":"The last stored check (reachable_with_embed, reachable_no_embed, protected, blocked, unreachable, unverified).","operationId":"site_health_wf_api_v1_workspaces__workspace_id__sites__site_id__health_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["sites"],"summary":"Site Health Check","description":"Check the site again now (the hardened fetcher, HTTPS only, 5 s).","operationId":"site_health_check_wf_api_v1_workspaces__workspace_id__sites__site_id__health_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/embed":{"get":{"tags":["sites"],"summary":"Site Embed","description":"The one stylesheet link for the site's <head> and the two role rules.\nThe CSS is public and deliberately answers without Origin or Referer (pages\nsent with `Referrer-Policy: no-referrer` must work); the font files it names\nare signed and answer only a request whose Origin is one of the site's hosts,\nand only for families a license on this site covers.","operationId":"site_embed_wf_api_v1_workspaces__workspace_id__sites__site_id__embed_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/mappings":{"get":{"tags":["mappings"],"summary":"Mappings","description":"The live revision (roles pin family, release, weight and style) and its fallbacks.","operationId":"mappings_wf_api_v1_workspaces__workspace_id__sites__site_id__mappings_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mappings"],"summary":"Mapping Apply","description":"A new revision. `expected_revision` is the revision you edited; if\nsomeone applied first the answer is 409 `version_conflict` (reload, review).","operationId":"mapping_apply_wf_api_v1_workspaces__workspace_id__sites__site_id__mappings_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/mappings/preview":{"post":{"tags":["mappings"],"summary":"Mapping Preview","description":"Validate and diff a role map without applying it. Read-only: no Idempotency-Key needed.\nSend `expected_revision` from the answer to the apply.","operationId":"mapping_preview_wf_api_v1_workspaces__workspace_id__sites__site_id__mappings_preview_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/mappings/history":{"get":{"tags":["mappings"],"summary":"Mapping History","description":"Every revision (newest first) and the site's audit events.","operationId":"mapping_history_wf_api_v1_workspaces__workspace_id__sites__site_id__mappings_history_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/mappings/rollback":{"post":{"tags":["mappings"],"summary":"Mapping Rollback","description":"A new revision equal to `to_revision`, after the same rights checks as any apply.","operationId":"mapping_rollback_wf_api_v1_workspaces__workspace_id__sites__site_id__mappings_rollback_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollbackIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/mappings/updates":{"get":{"tags":["mappings"],"summary":"Mapping Updates","description":"Newer releases of the pinned families. Listed, never applied for you.","operationId":"mapping_updates_wf_api_v1_workspaces__workspace_id__sites__site_id__mappings_updates_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/sites/{site_id}/transfers":{"post":{"tags":["transfers"],"summary":"Transfer Request","description":"Offer the site to a client (their owner's email or workspace). `token`\nand `link` are in this answer once (a replay answers them null); the site\nkeeps working here until the client's owner accepts.","operationId":"transfer_request_wf_api_v1_workspaces__workspace_id__sites__site_id__transfers_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["transfers"],"summary":"Transfers","description":"The site's transfer requests and how each ended (requested, completed, rejected, expired, failed).","operationId":"transfers_wf_api_v1_workspaces__workspace_id__sites__site_id__transfers_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/transfers/review":{"post":{"tags":["transfers"],"summary":"Transfer Review","description":"What the receiving owner sees before accepting: hosts, roles, releases,\nand per workspace whether it has the slot and the fonts (a dry run).\nRead only; POST so the token stays out of the URL.","operationId":"transfer_review_wf_api_v1_transfers_review_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/transfers/accept":{"post":{"tags":["transfers"],"summary":"Transfer Accept","description":"Owner-delegated only: the key needs `transfers:write` AND its person\nmust be an owner of the receiving workspace (the key's own). A member's\nkey is refused with 403 `owner_approval_required`.","operationId":"transfer_accept_wf_api_v1_transfers_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenAcceptIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/transfers/reject":{"post":{"tags":["transfers"],"summary":"Transfer Reject","description":"The addressed owner declines, or anyone in the sending workspace withdraws.","operationId":"transfer_reject_wf_api_v1_transfers_reject_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/affiliate/link":{"get":{"tags":["affiliates"],"summary":"Affiliate Link","description":"Your WonderFonT link (the home page) and the referral tag that counts on any\npage of the site (owner 09-24: one link and a tag, no list of deep links);\nwith `to`, a link to one WonderFonT page.","operationId":"affiliate_link_wf_api_v1_affiliate_link_get","parameters":[{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/affiliate/stats":{"get":{"tags":["affiliates"],"summary":"Affiliate Stats","description":"Visits, checkouts, orders, revenue and balances of the WonderFonT program over the last `days` (UTC).","operationId":"affiliate_stats_wf_api_v1_affiliate_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":366,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/affiliate/ledger":{"get":{"tags":["affiliates"],"summary":"Affiliate Ledger","description":"Your WonderFonT orders, ledger entries and reversals (newest first). Never presets rows, never the buyer.","operationId":"affiliate_ledger_wf_api_v1_affiliate_ledger_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/affiliate/settings":{"get":{"tags":["affiliates"],"summary":"Affiliate Settings","operationId":"affiliate_settings_wf_api_v1_affiliate_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["affiliates"],"summary":"Affiliate Settings Put","description":"Credit or cash, with the engine's cooldown between changes (422 while cooling down).","operationId":"affiliate_settings_put_wf_api_v1_affiliate_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewardIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/affiliate/payout":{"get":{"tags":["affiliates"],"summary":"Affiliate Payout","description":"Where cash goes (masked), whether it is ready, and the page where a person sets it up.","operationId":"affiliate_payout_wf_api_v1_affiliate_payout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/affiliate/withdrawals":{"post":{"tags":["affiliates"],"summary":"Affiliate Withdraw","description":"Ask for your available WonderFonT cash. This never approves or sends a\npayout: the answer is `requires_user_action` with the page where the person\nconfirms payout details; WonderFonT payouts are then made by the owner.","operationId":"affiliate_withdraw_wf_api_v1_affiliate_withdrawals_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/WithdrawIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptIn":{"properties":{"license_version":{"type":"string","title":"License Version"},"terms_version":{"type":"string","title":"Terms Version"},"immediate_delivery":{"type":"boolean","title":"Immediate Delivery"}},"type":"object","required":["license_version","terms_version","immediate_delivery"],"title":"AcceptIn","description":"The owner's acceptance of the current Font License Agreement and Terms\n(GET /pricing names the versions). Only a signed-in owner may send it.\nimmediate_delivery is the agreement box a person ticks: true is required\nfor every new purchase (buy_desktop, buy_web, subscribe, buy_pack)."},"ApplyIn":{"properties":{"roles":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","minProperties":1,"title":"Roles"},"expected_revision":{"type":"integer","minimum":0.0,"title":"Expected Revision"},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note"}},"type":"object","required":["roles","expected_revision"],"title":"ApplyIn"},"ApproveIn":{"properties":{"accept":{"anyOf":[{"$ref":"#/components/schemas/AcceptIn"},{"type":"null"}]}},"type":"object","title":"ApproveIn"},"CollectionIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"text_sample":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Text Sample"}},"type":"object","required":["name"],"title":"CollectionIn"},"ConnectIn":{"properties":{"name":{"type":"string","maxLength":80,"title":"Name","default":""},"scopes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Scopes"},"storefront":{"type":"string","enum":["en","he"],"title":"Storefront","default":"en"}},"type":"object","required":["scopes"],"title":"ConnectIn"},"DownloadIn":{"properties":{"family":{"type":"string","maxLength":64,"minLength":1,"title":"Family"},"kind":{"type":"string","enum":["desktop","web","all"],"title":"Kind","default":"desktop"}},"type":"object","required":["family"],"title":"DownloadIn"},"GrantIn":{"properties":{"api_key_id":{"type":"string","format":"uuid","title":"Api Key Id"},"operations":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Operations"},"max_cents":{"type":"integer","maximum":10000000.0,"minimum":0.0,"title":"Max Cents"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"recurring_allowed":{"type":"boolean","title":"Recurring Allowed","default":false},"site_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Site Ids"},"family_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Family Ids"},"accept":{"anyOf":[{"$ref":"#/components/schemas/AcceptIn"},{"type":"null"}]}},"type":"object","required":["api_key_id","operations","max_cents","expires_at"],"title":"GrantIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HostIn":{"properties":{"host":{"type":"string","maxLength":2048,"minLength":1,"title":"Host"}},"type":"object","required":["host"],"title":"HostIn"},"KeyIn":{"properties":{"name":{"type":"string","maxLength":80,"title":"Name","default":""},"scopes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Scopes"},"site_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Site Ids"}},"type":"object","required":["scopes"],"title":"KeyIn"},"PreviewIn":{"properties":{"text":{"type":"string","maxLength":200,"minLength":1,"title":"Text"},"styles":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":4,"title":"Styles"},"size":{"type":"integer","maximum":120.0,"minimum":16.0,"title":"Size","default":56}},"type":"object","required":["text"],"title":"PreviewIn"},"QuoteIn":{"properties":{"operation":{"type":"string","title":"Operation"},"terms":{"additionalProperties":true,"type":"object","title":"Terms","default":{}},"locale":{"type":"string","enum":["en","he"],"title":"Locale","default":"en"},"accept":{"anyOf":[{"$ref":"#/components/schemas/AcceptIn"},{"type":"null"}]}},"type":"object","required":["operation"],"title":"QuoteIn"},"RecommendIn":{"properties":{"use":{"anyOf":[{"type":"string","enum":["web","pdf","print","logo","local"]},{"type":"null"}],"title":"Use"},"script":{"anyOf":[{"type":"string","enum":["he","latin","both"]},{"type":"null"}],"title":"Script"},"sample_text":{"type":"string","maxLength":200,"title":"Sample Text","default":""},"roles":{"items":{"type":"string","enum":["heading","body","ui"]},"type":"array","maxItems":3,"title":"Roles"},"feel":{"items":{"type":"string","enum":["bold","clean","nostalgic","warm","formal","handmade"]},"type":"array","maxItems":6,"title":"Feel"},"task":{"items":{"type":"string","enum":["branding","posters","text","ui","packaging"]},"type":"array","maxItems":5,"title":"Task"},"classification":{"anyOf":[{"type":"string","enum":["serif","sans","display","script","mono"]},{"type":"null"}],"title":"Classification"},"weights":{"items":{"type":"integer"},"type":"array","maxItems":9,"title":"Weights"},"italic":{"type":"boolean","title":"Italic","default":false},"exclude":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Exclude"},"limit":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Limit","default":5},"locale":{"anyOf":[{"type":"string","enum":["en","he"]},{"type":"null"}],"title":"Locale"}},"type":"object","title":"RecommendIn","description":"A design brief. Only what changes the answer is needed; the rest narrows it."},"RewardIn":{"properties":{"reward_mode":{"type":"string","enum":["credit","cash"],"title":"Reward Mode"}},"type":"object","required":["reward_mode"],"title":"RewardIn"},"RolesIn":{"properties":{"roles":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","minProperties":1,"title":"Roles"}},"type":"object","required":["roles"],"title":"RolesIn"},"RollbackIn":{"properties":{"to_revision":{"type":"integer","minimum":1.0,"title":"To Revision"},"expected_revision":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Expected Revision"}},"type":"object","required":["to_revision"],"title":"RollbackIn"},"SignupIn":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"},"locale":{"type":"string","enum":["en","he"],"title":"Locale","default":"en"}},"type":"object","required":["email"],"title":"SignupIn"},"SignupVerifyIn":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"},"code":{"type":"string","maxLength":6,"minLength":6,"title":"Code"},"key_name":{"type":"string","maxLength":80,"title":"Key Name","default":"agent"},"storefront":{"type":"string","enum":["en","he"],"title":"Storefront","default":"en"}},"type":"object","required":["email","code"],"title":"SignupVerifyIn"},"SiteIn":{"properties":{"host":{"type":"string","maxLength":2048,"minLength":1,"title":"Host"},"grant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Grant Id"}},"type":"object","required":["host"],"title":"SiteIn"},"TokenAcceptIn":{"properties":{"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"expected_revision":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Expected Revision"},"token":{"type":"string","maxLength":128,"minLength":1,"title":"Token"}},"type":"object","required":["token"],"title":"TokenAcceptIn"},"TokenIn":{"properties":{"token":{"type":"string","maxLength":128,"minLength":1,"title":"Token"}},"type":"object","required":["token"],"title":"TokenIn"},"TransferIn":{"properties":{"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"locale":{"type":"string","enum":["en","he"],"title":"Locale","default":"en"}},"type":"object","title":"TransferIn"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WithdrawIn":{"properties":{"amount_cents":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Amount Cents"}},"type":"object","title":"WithdrawIn"}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","bearerFormat":"wf_<prefix>_<secret>"}}},"servers":[{"url":"https://wonderfont.art"}],"security":[{"bearer":[]},{}]}