openapi: 3.0.1 info: title: Passage by 1Password Management Devices Magic Links API description: Server-side REST Management API for Passage by 1Password, the passwordless / passkey authentication platform. Operations are scoped to a Passage application (app_id) and authenticated with a Bearer API key generated in the Passage Console (Settings -> API Keys). Covers user lifecycle (list, create, get, update, delete, activate, deactivate), WebAuthn device management, refresh-token revocation, and magic link creation. NOTE - 1Password has announced that the Passage product is being retired on 2026-01-16; this specification documents the API as published as of 2026-06-20. termsOfService: https://passage.1password.com contact: name: Passage by 1Password Support url: https://docs.passage.id/home version: '1.0' servers: - url: https://api.passage.id/v1 description: Passage Management API security: - bearerAuth: [] tags: - name: Magic Links description: Magic link creation for passwordless login and identifier verification. paths: /apps/{app_id}/magic-links: post: operationId: createMagicLink tags: - Magic Links summary: Create a magic link description: Creates a magic link for login or identifier verification. Supply email or phone; set send=true (with channel) to have Passage deliver it, otherwise the embedded link is returned for your own delivery. If the user does not exist they are created first. parameters: - $ref: '#/components/parameters/AppID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateMagicLinkRequest' responses: '201': description: The created magic link. content: application/json: schema: $ref: '#/components/schemas/MagicLinkResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' components: schemas: MagicLinkResponse: type: object properties: magic_link: $ref: '#/components/schemas/MagicLink' Error: type: object properties: code: type: string error: type: string message: type: string MagicLink: type: object properties: id: type: string app_id: type: string user_id: type: string identifier: type: string type: type: string enum: - login - verify_identifier redirect_url: type: string ttl: type: integer url: type: string secret: type: string activated: type: boolean CreateMagicLinkRequest: type: object properties: email: type: string format: email phone: type: string user_id: type: string description: Target an existing user by ID instead of an identifier. channel: type: string enum: - email - phone description: Delivery channel. Required if send is true. send: type: boolean description: Whether Passage should deliver the magic link. language: type: string description: Language of the email or SMS to send. magic_link_path: type: string description: Relative URL the magic link points to. redirect_url: type: string ttl: type: integer description: Time to live, in minutes. type: type: string enum: - login - verify_identifier description: Defaults to login. responses: BadRequest: description: The request was malformed. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: The API key is missing or invalid. content: application/json: schema: $ref: '#/components/schemas/Error' parameters: AppID: name: app_id in: path required: true description: The Passage application ID. schema: type: string securitySchemes: bearerAuth: type: http scheme: bearer description: 'Passage Management API key, sent as: Authorization: Bearer '