{"openapi":"3.1.0","info":{"title":"Thanh Nguyen Workshop API","version":"1.0.0","description":"Tạo API Key trong Cài đặt. Tài liệu và ví dụ: /api-docs. Mỗi key chỉ truy cập tài khoản của chủ key. Giới hạn 120 yêu cầu/phút chung cho các key của mỗi user; polling cách nhau ít nhất 3 giây."},"servers":[{"url":"https://otp.thanhnguyen.sbs"}],"paths":{"/api/v1/workshop/profiles":{"get":{"tags":["Device workshop"],"summary":"Device profiles available for new accounts","operationId":"mobile_profiles_api_v1_workshop_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]}},"/api/v1/workshop/device-profiles":{"get":{"tags":["Device workshop"],"summary":"Mac profiles available for new accounts","operationId":"device_profiles_api_v1_workshop_device_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]}},"/api/v1/workshop/me":{"get":{"tags":["Device workshop"],"summary":"Current customer and account quota","operationId":"me_api_v1_workshop_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]}},"/api/v1/workshop/proxy":{"get":{"tags":["Device workshop"],"summary":"Read your saved proxy configuration summary","operationId":"proxy_api_v1_workshop_proxy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"],"description":"Returns only mode, strategy, configured, value_set, proxy_count and generation. Never returns proxy credentials, provider URLs or assignments."},"put":{"tags":["Device workshop"],"summary":"Save the proxy configuration used by future logins","operationId":"update_proxy_api_v1_workshop_proxy_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"description":"Save the same per-user proxy configuration used by web and API logins. Existing jobs retain their snapshot. An omitted/null/blank value keeps the saved value only when mode is unchanged; mode=none clears it. No Apple connection or provider request is started by this endpoint."}},"/api/v1/workshop/proxy/details":{"get":{"tags":["Device workshop"],"summary":"Read your own saved proxy value","operationId":"proxy_details_api_v1_workshop_proxy_details_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"description":"Requires workshop:write because value contains the owner's saved proxy/provider secret. Returns the masked preview and full value; never log, publish or embed this response in client-side code."}},"/api/v1/workshop/bulk/preview":{"post":{"tags":["Device workshop"],"summary":"Validate account rows without starting login","operationId":"bulk_preview_api_v1_workshop_bulk_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPreviewInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"description":"Parse and classify rows without creating accounts, sending SMS or logging in. Returns counts and safe row metadata; never returns passwords, full phone numbers or OTP URLs."}},"/api/v1/workshop/bulk":{"post":{"tags":["Device workshop"],"summary":"Queue a batch using the workshop import flow","operationId":"bulk_submit_api_v1_workshop_bulk_post","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"description":"Required for account creation, login and bulk submission. Use a unique UUID for each intended operation; repeat the same key and JSON to safely retry. 8–128 ASCII letters, digits, '.', '_', ':', '-'. Retained seven days."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkInput"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"description":"Use the same import parser and queue as the web workshop. Up to 100 nonempty account lines and 256 KiB of UTF-8 input; text contains private passwords and optional HTTPS OTP sources. Preview first. One active batch per owner; account quota, existing-account retry rules and saved proxy allocation are unchanged. Idempotency-Key prevents duplicate submission. Replay returns the current batch, including after restart; it never restores passwords or automatically restarts interrupted rows. Follow each row's job_id using the existing job/OTP endpoints."},"get":{"tags":["Device workshop"],"summary":"List your latest twenty import batches","operationId":"bulk_list_api_v1_workshop_bulk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"],"description":"The latest 20 batches belonging to the key owner, including batches created in the web workshop. Superadmin keys remain owner-scoped."}},"/api/v1/workshop/bulk/{batch_id}":{"get":{"tags":["Device workshop"],"summary":"Read progress and account/job IDs for a batch","operationId":"bulk_detail_api_v1_workshop_bulk__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]}},"/api/v1/workshop/bulk/{batch_id}/cancel":{"post":{"tags":["Device workshop"],"summary":"Cancel pending rows and active logins in your batch","operationId":"bulk_cancel_api_v1_workshop_bulk__batch_id__cancel_post","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."},"description":"Stop pending rows and cancel active login jobs using the workshop coordinator. Already completed accounts and code links are preserved."}},"/api/v1/workshop/folders":{"get":{"tags":["Device workshop"],"summary":"List your folders","operationId":"folders_api_v1_workshop_folders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]},"post":{"tags":["Device workshop"],"summary":"Create a folder","operationId":"create_folder_api_v1_workshop_folders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderInput"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"]}},"/api/v1/workshop/folders/{folder_id}":{"patch":{"tags":["Device workshop"],"summary":"Rename a folder","operationId":"rename_folder_api_v1_workshop_folders__folder_id__patch","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"]},"delete":{"tags":["Device workshop"],"summary":"Remove a folder without removing its accounts","operationId":"delete_folder_api_v1_workshop_folders__folder_id__delete","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."}}},"/api/v1/workshop/accounts":{"get":{"tags":["Device workshop"],"summary":"List your accounts","operationId":"accounts_api_v1_workshop_accounts_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Page Size"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":254,"default":"","title":"Search"},"description":"Search Apple ID, label and note; applied before pagination."},{"name":"status","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"","title":"Status"}},{"name":"visibility","in":"query","required":false,"schema":{"type":"string","maxLength":16,"default":"visible","title":"Visibility"},"description":"visible (default), hidden, or all. Hidden accounts retain their code URLs."},{"name":"folder_id","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Folder Id"},"description":"Owner's folder ID, unfiled for accounts with no folder, or empty for all folders."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]},"post":{"tags":["Device workshop"],"summary":"Create an account and start login","operationId":"create_account_api_v1_workshop_accounts_post","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"description":"Required for account creation, login and bulk submission. Use a unique UUID for each intended operation; repeat the same key and JSON to safely retry. 8–128 ASCII letters, digits, '.', '_', ':', '-'. Retained seven days."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountInput"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"]}},"/api/v1/workshop/accounts/export":{"post":{"tags":["Device workshop"],"summary":"Export selected or all account code links as TXT","operationId":"export_accounts_api_v1_workshop_accounts_export_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountExportInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read","workshop:code"],"description":"Requires workshop:read and workshop:code. Returns JSON containing TXT text, count, with_link, without_link and filename. Each line is apple_id|device_api, with |note appended when present. Backslash, pipe and newlines in text fields are escaped. scope=selected accepts up to 10000 account_ids and preserves selection order; scope=all uses visibility and folder_id filters. Only the owner's accounts are exported; any foreign/missing selected ID fails the whole request. This does not create codes, authenticate, change device identities or rotate links."}},"/api/v1/workshop/accounts/{account_id}":{"get":{"tags":["Device workshop"],"summary":"Get an account","operationId":"account_api_v1_workshop_accounts__account_id__get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]},"patch":{"tags":["Device workshop"],"summary":"Update account notes, folder, visibility or enabled status","operationId":"update_account_api_v1_workshop_accounts__account_id__patch","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"description":"Change only the provided fields: label, note, folder_id, hidden, enabled. folder_id=null removes folder assignment. A folder must belong to the account owner. Metadata changes never reauthenticate or replace identity."},"delete":{"tags":["Device workshop"],"summary":"Hide an account while preserving its code URL","operationId":"delete_account_api_v1_workshop_accounts__account_id__delete","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."},"description":"Hide the account from the main list; preserve its identity, enabled state and existing device_api. Hidden accounts still count toward quota and support details/code requests. PATCH hidden=false restores visibility. To stop code access use enabled=false; rotate-link revokes the old URL."}},"/api/v1/workshop/accounts/{account_id}/login":{"post":{"tags":["Device workshop"],"summary":"Start a new login for an existing account","operationId":"login_api_v1_workshop_accounts__account_id__login_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"description":"Required for account creation, login and bulk submission. Use a unique UUID for each intended operation; repeat the same key and JSON to safely retry. 8–128 ASCII letters, digits, '.', '_', ':', '-'. Retained seven days."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginInput"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"]}},"/api/v1/workshop/accounts/{account_id}/rotate-link":{"post":{"tags":["Device workshop"],"summary":"Replace the account's code URL","operationId":"rotate_link_api_v1_workshop_accounts__account_id__rotate_link_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write","workshop:code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."}}},"/api/v1/workshop/accounts/{account_id}/code":{"post":{"tags":["Device workshop"],"summary":"Get the current six-digit code","operationId":"account_code_api_v1_workshop_accounts__account_id__code_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit or code_queue_full; wait for Retry-After seconds before requesting the code again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}},"503":{"description":"code_queue_timeout: the request expired before execution. Wait for Retry-After seconds and request the code again; no new account or login is needed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait for code_queue_timeout","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:code"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."}}},"/api/v1/workshop/jobs/{job_id}":{"get":{"tags":["Device workshop"],"summary":"Check login progress","operationId":"job_api_v1_workshop_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:read"]}},"/api/v1/workshop/jobs/{job_id}/otp":{"post":{"tags":["Device workshop"],"summary":"Submit a six-digit verification code","operationId":"otp_api_v1_workshop_jobs__job_id__otp_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTPInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"]}},"/api/v1/workshop/jobs/{job_id}/factor-options":{"post":{"tags":["Device workshop"],"summary":"Load available verification methods","operationId":"factor_options_api_v1_workshop_jobs__job_id__factor_options_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."}}},"/api/v1/workshop/jobs/{job_id}/send-code":{"post":{"tags":["Device workshop"],"summary":"Send a verification code to a selected phone or trusted device","operationId":"send_code_api_v1_workshop_jobs__job_id__send_code_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactorInput"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"]}},"/api/v1/workshop/jobs/{job_id}/cancel":{"post":{"tags":["Device workshop"],"summary":"Cancel a login","operationId":"cancel_api_v1_workshop_jobs__job_id__cancel_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."}}},"/api/v1/workshop/jobs/{job_id}/automation/cancel":{"post":{"tags":["Device workshop"],"summary":"Switch automatic SMS collection to manual code input","operationId":"stop_automation_api_v1_workshop_jobs__job_id__automation_cancel_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Invalid input; only field names are returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"401":{"description":"API Key absent, invalid, expired or revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"403":{"description":"Insufficient scope or account permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"409":{"description":"Conflict; inspect error code and current job before retrying","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}}},"429":{"description":"Rate limit; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}}}},"security":[{"APIKeyBearer":[]}],"x-required-scopes":["workshop:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0},"example":{}}},"description":"Gửi JSON {} để có Content-Type application/json."}}}},"components":{"schemas":{"ProxyInput":{"properties":{"mode":{"type":"string","enum":["none","direct","api","list"],"title":"Mode","description":"none: no proxy; direct: one proxy endpoint; api: HTTPS proxy-provider URL; list: newline-separated proxy endpoints."},"strategy":{"type":"string","enum":["per_account","smart"],"title":"Strategy","default":"per_account","description":"per_account (default): reuse saved Workshop account assignments; accounts may share healthy proxies in turns. smart: prefer an available idle proxy or the shortest queue. Reuse healthy list/API proxies; do not fetch a new IP for every account. Both keep the proxy fixed once a session starts, including during OTP. direct always uses its sole endpoint."},"value":{"anyOf":[{"type":"string","maxLength":196608,"format":"password","writeOnly":true},{"type":"null"}],"title":"Value","description":"Proxy URL, HTTPS provider URL, or newline-separated list according to mode. Proxy schemes: http, https, socks4, socks5, socks5h, with an explicit port and public address. Credentials are secret. When mode is unchanged, an omitted, null or blank value reuses the saved value, if available."}},"additionalProperties":false,"type":"object","required":["mode"],"title":"ProxyInput","description":"Proxy for Apple login/binding connections, fixed through OTP within a job. Does not proxy website sign-in, the caller's API connection, or code retrieval. An explicit object updates the user's saved proxy configuration, shared with the web and future logins; mode none disables that saved configuration."},"BulkPreviewInput":{"properties":{"text":{"type":"string","maxLength":262144,"minLength":1,"format":"password","title":"Text","writeOnly":true}},"additionalProperties":false,"type":"object","required":["text"],"title":"BulkPreviewInput"},"BulkInput":{"properties":{"profile_id":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Profile Id"},"device_model":{"type":"string","maxLength":64,"title":"Device Model","default":"default"},"device_name":{"type":"string","maxLength":128,"title":"Device Name","default":""},"device_os":{"type":"string","maxLength":64,"title":"Device Os","default":"default"},"text":{"type":"string","maxLength":262144,"minLength":1,"format":"password","title":"Text","writeOnly":true},"proxy":{"anyOf":[{"$ref":"#/components/schemas/ProxyInput"},{"type":"null"}],"description":"Omit or send null to inherit the user's saved proxy configuration (none if not configured). An object updates the saved configuration and snapshots it for the new job; {\"mode\":\"none\"} disables proxy for the new job and future inherited requests. Existing jobs keep their original configuration."},"note":{"type":"string","maxLength":4000,"title":"Note","default":""},"folder_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Folder Id"}},"additionalProperties":false,"type":"object","required":["text"],"title":"BulkInput"},"FolderInput":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"additionalProperties":false,"type":"object","required":["name"],"title":"FolderInput"},"AccountInput":{"properties":{"profile_id":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Profile Id"},"device_model":{"type":"string","maxLength":64,"title":"Device Model","default":"default"},"device_name":{"type":"string","maxLength":128,"title":"Device Name","default":""},"device_os":{"type":"string","maxLength":64,"title":"Device Os","default":"default"},"password":{"type":"string","maxLength":1024,"minLength":1,"format":"password","title":"Password","writeOnly":true},"proxy":{"anyOf":[{"$ref":"#/components/schemas/ProxyInput"},{"type":"null"}],"description":"Omit or send null to inherit the user's saved proxy configuration (none if not configured). An object updates the saved configuration and snapshots it for the new job; {\"mode\":\"none\"} disables proxy for the new job and future inherited requests. Existing jobs keep their original configuration."},"otp_source":{"anyOf":[{"$ref":"#/components/schemas/OTPSourceInput"},{"type":"null"}]},"apple_id":{"type":"string","maxLength":254,"minLength":3,"title":"Apple Id"},"label":{"type":"string","maxLength":200,"title":"Label","default":""},"note":{"type":"string","maxLength":4000,"title":"Note","default":"","description":"Optional private account note, up to 4000 characters; multiline allowed."},"folder_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Folder Id","description":"Optional folder ID owned by this API key's user; null leaves the account unfiled."}},"additionalProperties":false,"type":"object","required":["password","apple_id"],"title":"AccountInput"},"OTPSourceInput":{"properties":{"url":{"type":"string","maxLength":4096,"minLength":1,"format":"password","title":"Url","writeOnly":true},"phone":{"anyOf":[{"type":"string","maxLength":32,"format":"password","writeOnly":true},{"type":"null"}],"title":"Phone"}},"additionalProperties":false,"type":"object","required":["url"],"title":"OTPSourceInput"},"AccountExportInput":{"properties":{"scope":{"type":"string","enum":["selected","all"],"title":"Scope"},"account_ids":{"items":{"type":"string","maxLength":64,"minLength":1},"type":"array","maxItems":10000,"title":"Account Ids"},"visibility":{"type":"string","enum":["visible","hidden","all"],"title":"Visibility","default":"visible"},"folder_id":{"type":"string","maxLength":64,"title":"Folder Id","default":""}},"additionalProperties":false,"type":"object","required":["scope"],"title":"AccountExportInput"},"AccountPatch":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Label"},"note":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Note"},"folder_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Folder Id"},"hidden":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hidden"}},"additionalProperties":false,"type":"object","title":"AccountPatch"},"LoginInput":{"properties":{"password":{"type":"string","maxLength":1024,"minLength":1,"format":"password","title":"Password","writeOnly":true},"proxy":{"anyOf":[{"$ref":"#/components/schemas/ProxyInput"},{"type":"null"}],"description":"Omit or send null to inherit the user's saved proxy configuration (none if not configured). An object updates the saved configuration and snapshots it for the new job; {\"mode\":\"none\"} disables proxy for the new job and future inherited requests. Existing jobs keep their original configuration."},"otp_source":{"anyOf":[{"$ref":"#/components/schemas/OTPSourceInput"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["password"],"title":"LoginInput"},"OTPInput":{"properties":{"code":{"type":"string","maxLength":6,"minLength":6,"format":"password","title":"Code","writeOnly":true}},"additionalProperties":false,"type":"object","required":["code"],"title":"OTPInput"},"FactorInput":{"properties":{"mode":{"type":"string","enum":["sms","trusted_device"],"title":"Mode"},"phone_id":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":0.0},{"type":"null"}],"title":"Phone Id"}},"additionalProperties":false,"type":"object","required":["mode"],"title":"FactorInput"},"CustomerError":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"account_id":{"type":"string"},"job_id":{"type":"string"},"batch_id":{"type":"string"}}}},"securitySchemes":{"APIKeyBearer":{"type":"http","scheme":"bearer","bearerFormat":"xid_…","description":"API Key tạo ở Cài đặt; không dùng cookie hoặc query string."}}}}