openapi: 3.1.0 info: title: 'TTRPG Manager — API v1' description: 'API do zarządzania kampaniami TTRPG, treściami, mapami, kartami postaci i podręcznikami.' version: 1.0.0 servers: - url: '{{ request()->getSchemeAndHttpHost() }}' tags: - name: Authentication description: "\nRegistration and short-lived application sessions." - name: Endpoints description: '' - name: GM description: '' - name: Player description: '' components: securitySchemes: default: type: http scheme: bearer description: 'MG tworzy token w panelu Integracje API. Token jest wyświetlany tylko raz.' security: - default: [] paths: /api/v1/auth/register: post: summary: 'Register an account.' operationId: registerAnAccount description: '' parameters: [] responses: {} tags: - Authentication requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' examples: - b email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' examples: - zbailey@example.net password: type: string description: 'Must be at least 8 characters.' examples: - '-0pBNvYgxw' role: type: string description: '' examples: - architecto locale: type: string description: '' examples: - null device_name: type: string description: 'Must not be greater than 100 characters.' examples: - 'n' required: - name - email - password - role security: [] /api/v1/auth/login: post: summary: 'Log in and issue a two-hour token.' operationId: logInAndIssueATwoHourToken description: '' parameters: [] responses: {} tags: - Authentication requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address.' examples: - gbailey@example.net password: type: string description: '' examples: - '|]|{+-' device_name: type: string description: 'Must not be greater than 100 characters.' examples: - v required: - email - password security: [] /api/v1/auth/logout: post: summary: 'Log out the current session or revoke its token.' operationId: logOutTheCurrentSessionOrRevokeItsToken description: '' parameters: [] responses: {} tags: - Authentication /api/v1/me: get: summary: '' operationId: getApiV1Me description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Endpoints /api/v1/gm/campaigns: get: summary: '' operationId: getApiV1GmCampaigns description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmCampaigns description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' examples: - b description: type: - string - 'null' description: 'Must not be greater than 10000 characters.' examples: - 'Et animi quos velit et fugiat.' is_archived: type: boolean description: '' examples: - false required: - name '/api/v1/gm/campaigns/{id}': get: summary: '' operationId: getApiV1GmCampaignsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmCampaignsId description: '' parameters: [] responses: {} tags: - GM requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' examples: - b description: type: - string - 'null' description: 'Must not be greater than 10000 characters.' examples: - 'Et animi quos velit et fugiat.' is_archived: type: boolean description: '' examples: - true regenerate_invite_code: type: boolean description: '' examples: - false delete: summary: '' operationId: deleteApiV1GmCampaignsId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: id description: 'The ID of the campaign.' required: true schema: type: string examples: - architecto - in: path name: campaign description: 'Campaign ID.' required: true schema: type: integer examples: - 1 '/api/v1/gm/campaigns/{campaign}/members': get: summary: 'List campaign members.' operationId: listCampaignMembers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: 'Add or update a campaign membership.' operationId: addOrUpdateACampaignMembership description: '' parameters: [] responses: {} tags: - GM requestBody: required: false content: application/json: schema: type: object properties: user_id: type: integer description: 'This field is required when email is not present. Must match an existing stored value.' examples: - 16 email: type: string description: 'This field is required when user_id is not present. Must be a valid email address. Must match an existing stored value.' examples: - zbailey@example.net role: type: string description: '' examples: - null parameters: - in: path name: campaign description: 'Campaign ID.' required: true schema: type: integer examples: - 1 '/api/v1/gm/campaigns/{campaign}/members/{user}': delete: summary: 'Remove a campaign member.' operationId: removeACampaignMember description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'Campaign ID.' required: true schema: type: integer examples: - 1 - in: path name: user description: 'Member user ID.' required: true schema: type: integer examples: - 2 '/api/v1/gm/campaigns/{campaign}/contents': get: summary: '' operationId: getApiV1GmCampaignsCampaignContents description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmCampaignsCampaignContents description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/contents/{id}': get: summary: '' operationId: getApiV1GmCampaignsCampaignContentsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmCampaignsCampaignContentsId description: '' parameters: [] responses: {} tags: - GM delete: summary: '' operationId: deleteApiV1GmCampaignsCampaignContentsId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the content.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/assets': post: summary: 'Upload a campaign image.' operationId: uploadACampaignImage description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: multipart/form-data: schema: type: object properties: image: type: string format: binary description: 'JPEG, PNG, GIF or WebP image (max 10 MB).' required: - image parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/maps': get: summary: '' operationId: getApiV1GmCampaignsCampaignMaps description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmCampaignsCampaignMaps description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: application/json: schema: type: object properties: image_asset_id: type: integer description: '' examples: - 16 title: type: string description: 'Must not be greater than 255 characters.' examples: - 'n' description: type: - string - 'null' description: 'Must not be greater than 10000 characters.' examples: - 'Animi quos velit et fugiat.' visibility: type: string description: '' examples: - null required: - image_asset_id - title parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/maps/{id}': get: summary: '' operationId: getApiV1GmCampaignsCampaignMapsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmCampaignsCampaignMapsId description: '' parameters: [] responses: {} tags: - GM requestBody: required: false content: application/json: schema: type: object properties: image_asset_id: type: integer description: '' examples: - 16 title: type: string description: 'Must not be greater than 255 characters.' examples: - 'n' description: type: - string - 'null' description: 'Must not be greater than 10000 characters.' examples: - 'Animi quos velit et fugiat.' visibility: type: string description: '' examples: - null delete: summary: '' operationId: deleteApiV1GmCampaignsCampaignMapsId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the map.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/maps/{map}/pins': get: summary: '' operationId: getApiV1GmCampaignsCampaignMapsMapPins description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmCampaignsCampaignMapsMapPins description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: map description: 'The map.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/maps/{map}/pins/{id}': get: summary: '' operationId: getApiV1GmCampaignsCampaignMapsMapPinsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmCampaignsCampaignMapsMapPinsId description: '' parameters: [] responses: {} tags: - GM delete: summary: '' operationId: deleteApiV1GmCampaignsCampaignMapsMapPinsId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: map description: 'The map.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the pin.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/trackers': get: summary: '' operationId: getApiV1GmCampaignsCampaignTrackers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmCampaignsCampaignTrackers description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/trackers/{id}': get: summary: '' operationId: getApiV1GmCampaignsCampaignTrackersId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmCampaignsCampaignTrackersId description: '' parameters: [] responses: {} tags: - GM delete: summary: '' operationId: deleteApiV1GmCampaignsCampaignTrackersId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the tracker.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/trackers/{tracker}/entries': get: summary: '' operationId: getApiV1GmCampaignsCampaignTrackersTrackerEntries description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmCampaignsCampaignTrackersTrackerEntries description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: tracker description: 'The tracker.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/trackers/{tracker}/entries/{id}': get: summary: '' operationId: getApiV1GmCampaignsCampaignTrackersTrackerEntriesId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmCampaignsCampaignTrackersTrackerEntriesId description: '' parameters: [] responses: {} tags: - GM delete: summary: '' operationId: deleteApiV1GmCampaignsCampaignTrackersTrackerEntriesId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: tracker description: 'The tracker.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the entry.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/sheets': get: summary: '' operationId: getApiV1GmCampaignsCampaignSheets description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmCampaignsCampaignSheets description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: application/json: schema: type: object properties: owner_user_id: type: integer description: '' examples: - 16 avatar_asset_id: type: - string - 'null' description: '' examples: - null name: type: string description: 'Must not be greater than 255 characters.' examples: - 'n' content_html: type: string description: 'Must not be greater than 1000000 characters.' examples: - g pin: type: string description: 'Must be between 4 and 12 digits.' examples: - '1374491716' required: - owner_user_id - name - pin parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/sheets/{id}': get: summary: '' operationId: getApiV1GmCampaignsCampaignSheetsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmCampaignsCampaignSheetsId description: '' parameters: [] responses: {} tags: - GM requestBody: required: false content: application/json: schema: type: object properties: owner_user_id: type: integer description: '' examples: - 16 avatar_asset_id: type: - string - 'null' description: '' examples: - null name: type: string description: 'Must not be greater than 255 characters.' examples: - 'n' content_html: type: string description: 'Must not be greater than 1000000 characters.' examples: - g delete: summary: '' operationId: deleteApiV1GmCampaignsCampaignSheetsId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the sheet.' required: true schema: type: string examples: - architecto '/api/v1/gm/campaigns/{campaign}/sheets/{sheet}/pin': put: summary: 'Set a new PIN and revoke all existing sheet unlocks.' operationId: setANewPINAndRevokeAllExistingSheetUnlocks description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: application/json: schema: type: object properties: pin: type: string description: 'Must be between 4 and 12 digits.' examples: - '1374491716' required: - pin parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: sheet description: 'The sheet.' required: true schema: type: string examples: - architecto /api/v1/gm/handbooks: get: summary: '' operationId: getApiV1GmHandbooks description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: 'Upload a private PDF and queue text extraction.' operationId: uploadAPrivatePDFAndQueueTextExtraction description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: multipart/form-data: schema: type: object properties: pdf: type: string format: binary description: 'PDF file (max 50 MB).' title: type: string description: 'Must not be greater than 255 characters.' examples: - b campaign_id: type: - integer - 'null' description: '' examples: - 16 language: type: string description: 'Must not be greater than 12 characters.' examples: - ngzm required: - pdf - title /api/v1/gm/handbooks/search: post: summary: 'Search ready handbooks using SQLite FTS5.' operationId: searchReadyHandbooksUsingSQLiteFTS5 description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: application/json: schema: type: object properties: query: type: string description: 'Must be at least 2 characters. Must not be greater than 200 characters.' examples: - b handbook_ids: type: array description: '' items: type: integer examples: - - 16 limit: type: integer description: 'Must be between 1 and 100.' examples: - 2 required: - query '/api/v1/gm/handbooks/{id}': get: summary: '' operationId: getApiV1GmHandbooksId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM put: summary: '' operationId: putApiV1GmHandbooksId description: '' parameters: [] responses: {} tags: - GM requestBody: required: false content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' examples: - b campaign_id: type: - integer - 'null' description: '' examples: - 16 language: type: string description: 'Must not be greater than 12 characters.' examples: - ngzm delete: summary: '' operationId: deleteApiV1GmHandbooksId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: id description: 'The ID of the handbook.' required: true schema: type: string examples: - architecto '/api/v1/gm/handbooks/{handbook}/pages': get: summary: '' operationId: getApiV1GmHandbooksHandbookPages description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM parameters: - in: path name: handbook description: 'The handbook.' required: true schema: type: string examples: - architecto '/api/v1/gm/handbooks/{handbook}/preview-link': get: summary: 'Mint a temporary signed URL to open the PDF inline (no Bearer on the URL itself).' operationId: mintATemporarySignedURLToOpenThePDFInlinenoBearerOnTheURLItself description: "Use the returned `url` in an iframe, new tab, or window.open. Optional `#page=N`\nis appended for native browser PDF viewers." parameters: - in: query name: page description: 'optional 1-based page number for `#page=N`.' required: false schema: type: integer description: 'optional 1-based page number for `#page=N`.' examples: - 12 - in: query name: expires_in description: 'optional Link TTL in seconds (60–3600, default 600).' required: false schema: type: integer description: 'optional Link TTL in seconds (60–3600, default 600).' examples: - 600 responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM requestBody: required: false content: application/json: schema: type: object properties: page: type: - integer - 'null' description: 'Must be at least 1.' examples: - 16 expires_in: type: integer description: 'Must be between 60 and 3600.' examples: - 61 parameters: - in: path name: handbook description: 'The handbook.' required: true schema: type: string examples: - architecto /api/v1/gm/tokens: get: summary: '' operationId: getApiV1GmTokens description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - GM post: summary: '' operationId: postApiV1GmTokens description: '' parameters: [] responses: {} tags: - GM requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 100 characters.' examples: - b abilities: type: array description: '' items: type: string examples: - - architecto expires_in_days: type: - integer - 'null' description: 'Must be between 1 and 365.' examples: - 2 required: - name '/api/v1/gm/tokens/{id}': delete: summary: '' operationId: deleteApiV1GmTokensId description: '' parameters: [] responses: {} tags: - GM parameters: - in: path name: id description: 'The ID of the token.' required: true schema: type: string examples: - architecto /api/v1/player/campaigns: get: summary: '' operationId: getApiV1PlayerCampaigns description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player /api/v1/player/campaigns/join: post: summary: 'Join a campaign.' operationId: joinACampaign description: '' parameters: [] responses: {} tags: - Player requestBody: required: true content: application/json: schema: type: object properties: invite_code: type: string description: 'Campaign invitation code.' examples: - ABCDE12345 required: - invite_code '/api/v1/player/campaigns/{id}': get: summary: '' operationId: getApiV1PlayerCampaignsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: id description: 'The ID of the campaign.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/contents': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignContents description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/contents/{id}': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignContentsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the content.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/maps': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignMaps description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/maps/{id}': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignMapsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the map.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/maps/{map}/pins': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignMapsMapPins description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: map description: 'The map.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/trackers': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignTrackers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/trackers/{id}': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignTrackersId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the tracker.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/sheets': get: summary: '' operationId: getApiV1PlayerCampaignsCampaignSheets description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player post: summary: '' operationId: postApiV1PlayerCampaignsCampaignSheets description: '' parameters: [] responses: {} tags: - Player requestBody: required: true content: application/json: schema: type: object properties: avatar_asset_id: type: - string - 'null' description: '' examples: - null name: type: string description: 'Must not be greater than 255 characters.' examples: - b content_html: type: string description: 'Must not be greater than 1000000 characters.' examples: - 'n' pin: type: string description: 'Must be between 4 and 12 digits.' examples: - '1374491716' required: - name - pin parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/sheet-assets': post: summary: '' operationId: postApiV1PlayerCampaignsCampaignSheetAssets description: '' parameters: [] responses: {} tags: - Player requestBody: required: true content: multipart/form-data: schema: type: object properties: image: type: string format: binary description: 'Must be an image. Must not be greater than 10240 kilobytes.' required: - image parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/sheets/{sheet}/verify-pin': post: summary: 'Verify a PIN and issue a 15-minute sheet unlock.' operationId: verifyAPINAndIssueA15MinuteSheetUnlock description: '' parameters: [] responses: 422: description: '' content: application/json: schema: type: object properties: message: type: string examples: - 'Podany PIN jest nieprawidłowy.' errors: type: object properties: pin: type: array items: type: string examples: - - 'Podany PIN jest nieprawidłowy.' examples: - message: 'Podany PIN jest nieprawidłowy.' errors: pin: - 'Podany PIN jest nieprawidłowy.' tags: - Player requestBody: required: true content: application/json: schema: type: object properties: pin: type: string description: 'Must be between 4 and 12 digits.' examples: - '1374491716' required: - pin parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: sheet description: 'The sheet.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/sheets/{sheet}': get: summary: 'Open a sheet.' operationId: openASheet description: '' parameters: - in: header name: X-Sheet-Unlock description: '' schema: type: string examples: - 'required Short-lived sheet unlock token.' responses: 401: description: '' content: application/json: schema: type: object properties: message: type: string examples: - Unauthenticated. examples: - message: Unauthenticated. tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: sheet description: 'The sheet.' required: true schema: type: string examples: - architecto '/api/v1/player/campaigns/{campaign}/sheets/{id}': put: summary: 'Update an owned sheet.' operationId: updateAnOwnedSheet description: '' parameters: - in: header name: X-Sheet-Unlock description: '' schema: type: string examples: - 'required An unlock token with edit ability.' responses: {} tags: - Player requestBody: required: false content: application/json: schema: type: object properties: avatar_asset_id: type: - string - 'null' description: '' examples: - null name: type: string description: 'Must not be greater than 255 characters.' examples: - b content_html: type: string description: 'Must not be greater than 1000000 characters.' examples: - 'n' delete: summary: 'Delete an owned sheet.' operationId: deleteAnOwnedSheet description: '' parameters: - in: header name: X-Sheet-Unlock description: '' schema: type: string examples: - 'required An unlock token with edit ability.' responses: {} tags: - Player parameters: - in: path name: campaign description: 'The campaign.' required: true schema: type: string examples: - architecto - in: path name: id description: 'The ID of the sheet.' required: true schema: type: string examples: - architecto