# Table of Contents - [About Akord | Akord docs](#about-akord-akord-docs) - [Akord–Arweave Sunsetting FAQs | Akord docs](#akord-arweave-sunsetting-faqs-akord-docs) - [Simple API upload | Akord docs](#simple-api-upload-akord-docs) - [Learn | Akord docs](#learn-akord-docs) - [Tags | Akord docs](#tags-akord-docs) - [Akord protocol | Akord docs](#akord-protocol-akord-docs) - [Vault | Akord docs](#vault-akord-docs) - [Functions | Akord docs](#functions-akord-docs) - [Membership | Akord docs](#membership-akord-docs) - [Node | Akord docs](#node-akord-docs) - [Functions | Akord docs](#functions-akord-docs) - [Fields | Akord docs](#fields-akord-docs) - [Fields | Akord docs](#fields-akord-docs) - [Fields | Akord docs](#fields-akord-docs) - [Functions | Akord docs](#functions-akord-docs) - [Technical Litepaper | Akord docs](#technical-litepaper-akord-docs) - [Troubleshooting website publishing | Akord docs](#troubleshooting-website-publishing-akord-docs) - [Bundling | Akord docs](#bundling-akord-docs) - [Publishing a website | Akord docs](#publishing-a-website-akord-docs) - [Build | Akord docs](#build-akord-docs) - [REST API | Akord docs](#rest-api-akord-docs) - [Rate limits | Akord docs](#rate-limits-akord-docs) - [SDK – AkordJS | Akord docs](#sdk-akordjs-akord-docs) - [Timeouts | Akord docs](#timeouts-akord-docs) - [End-to-end encryption | Akord docs](#end-to-end-encryption-akord-docs) - [Webhooks | Akord docs](#webhooks-akord-docs) - [Examples | Akord docs](#examples-akord-docs) - [Authentication | Akord docs](#authentication-akord-docs) - [Modules | Akord docs](#modules-akord-docs) - [Usage | Akord docs](#usage-akord-docs) - [Examples | Akord docs](#examples-akord-docs) - [Arweave Gateway – AKRD | Akord docs](#arweave-gateway-akrd-akord-docs) - [Multipart uploads | Akord docs](#multipart-uploads-akord-docs) - [CLI | Akord docs](#cli-akord-docs) - [Memos / messages | Akord docs](#memos-messages-akord-docs) - [Login | Akord docs](#login-akord-docs) - [Memberships | Akord docs](#memberships-akord-docs) - [Vaults | Akord docs](#vaults-akord-docs) - [Simple uploads | Akord docs](#simple-uploads-akord-docs) - [Folders | Akord docs](#folders-akord-docs) - [Vault | Akord docs](#vault-akord-docs) - [Files and stacks | Akord docs](#files-and-stacks-akord-docs) - [Add manifest | Akord docs](#add-manifest-akord-docs) - [Quick start | Akord docs](#quick-start-akord-docs) - [Akord Wallet | Akord docs](#akord-wallet-akord-docs) - [Sharing files | Akord docs](#sharing-files-akord-docs) - [Timeline | Akord docs](#timeline-akord-docs) - [Messaging | Akord docs](#messaging-akord-docs) - [Auth | Akord docs](#auth-akord-docs) - [Media gallery | Akord docs](#media-gallery-akord-docs) - [Product guides | Akord docs](#product-guides-akord-docs) - [Manifest | Akord docs](#manifest-akord-docs) - [Akord Vaults | Akord docs](#akord-vaults-akord-docs) - [Recovery phrase explained | Akord docs](#recovery-phrase-explained-akord-docs) - [Invites | Akord docs](#invites-akord-docs) - [Creating a vault | Akord docs](#creating-a-vault-akord-docs) - [File management | Akord docs](#file-management-akord-docs) - [Batch | Akord docs](#batch-akord-docs) - [File versioning | Akord docs](#file-versioning-akord-docs) - [Sort/filter, folders & batch actions | Akord docs](#sort-filter-folders-batch-actions-akord-docs) - [Vault info | Akord docs](#vault-info-akord-docs) - [Storage | Akord docs](#storage-akord-docs) - [Signing up | Akord docs](#signing-up-akord-docs) - [File info | Akord docs](#file-info-akord-docs) - [Top ups | Akord docs](#top-ups-akord-docs) - [Reveal recovery phrase | Akord docs](#reveal-recovery-phrase-akord-docs) - [Vault types explained | Akord docs](#vault-types-explained-akord-docs) - [Folder | Akord docs](#folder-akord-docs) - [Memo (message) | Akord docs](#memo-message-akord-docs) - [Notes | Akord docs](#notes-akord-docs) - [Change password | Akord docs](#change-password-akord-docs) - [Membership | Akord docs](#membership-akord-docs) - [Monitoring usage | Akord docs](#monitoring-usage-akord-docs) - [Note | Akord docs](#note-akord-docs) - [Uploading files | Akord docs](#uploading-files-akord-docs) - [Account deletion | Akord docs](#account-deletion-akord-docs) - [Blockchain transactions | Akord docs](#blockchain-transactions-akord-docs) - [Stack (file) | Akord docs](#stack-file-akord-docs) - [Account | Akord docs](#account-akord-docs) --- # About Akord | Akord docs [hashtag](https://docs.akord.com/#what-is-akord) What is Akord? -------------------------------------------------------------------- Akord is a platform for empowering individuals and organizations with data ownership. We've been building on Arweave for the last few years, but we're moving to Walrus **If you've been using Akord on Arweave, please refer to the sunsetting FAQs:** [🌇Akord–Arweave Sunsetting FAQschevron-right](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs) circle-info These docs will soon be updated to reflect our documentation for the app and API on Walrus. Last updated 1 year ago --- # Akord–Arweave Sunsetting FAQs | Akord docs ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#do-i-get-any-rewards-for-being-an-akord-customer) **Do I get any rewards for being an Akord customer?** * Yes, if you have been a subscriber or made a top up purchase, you will be eligible to 3 free months on the Pro plan for the new version of Akord. Please fill this [formarrow-up-right](https://forms.gle/ESnEp17SunBk255T6) and we will arrange a coupon code. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#how-long-will-v2.akord.com-keep-running-for) **How long will v2.akord.com keep running for?** * Akord app on Arweave, v2.akord.com, will be sunset over a 6-month period, with the final day TBC ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#how-will-i-find-and-access-my-data-after-the-sunsetting-period) **How will I find and access my data after the sunsetting period?** * During the sunsetting period we will launch Akord Weave (previously referred to as Akord Explorer), a read-only dApp deployed directly on Arweave itself. Akord Weave will run on Arweave, independently of Akord the company, and give anyone with data uploaded to Arweave using Akord the ability to find, retrieve and decrypt (if private) their vaults and data inside. All you need is your backup phrase to connect to Akord Weave. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#what-steps-should-i-take-to-ensure-i-dont-lose-any-data) **What steps should I take to ensure I don't lose any data?** * Note that all your data in permanent vaults is on Arweave so will never get deleted. We will release Akord Weave as a tool living on Arweave itself, giving you perpetual access to any data uploaded. * You should get your backup phrase by going to Account > Privacy & secruity > Reveal backup phrase. This will ensure you can connect to Akord Weave when it's released and access all your data. * You may also consider noting the transaction IDs of critical data, which you can use to locate data on Arweave using the blockchain explorer, Viewblock.io * If you have been using cloud storage vaults, then over the sunsetting period you should download this data and migrate it to another service. The new Akord app, running on the Walrus storage protocol, would provide a more secure temporary storage solution than these cloud vaults running on AWS. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#what-will-happen-to-my-subscription) **What will happen to my subscription?** * We have stopped charging for all subscriptions. Subscribers gained discounts on permanent storage and additional cloud storage, but these benefits are no longer available. Customers of the API will maintain their higher access for the duration of the sunsetting period. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#can-i-still-access-my-vaults) **Can I still access my vaults?** * Your current vaults will be accessible throughout the sunsetting period, and afterwards they will be accessible through Akord Weave. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#can-i-upload-using-my-existing-storage-balance) **Can I upload using my existing storage balance?** * Yes, if you still have unused permanent storage on your account then you can continue to upload to Arweave using this balance for the duration of the sunsetting period. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#can-i-get-a-refund-for-storage-i-have-paid-for-but-havent-used-yet) **Can I get a refund for storage I have paid for but haven't used yet?** * Yes, if you purchased permanent storage from us, but haven't yet used it all and would prefer to get a refund over using the remaining balance, then please [contact usenvelope](mailto:support@akord.com) to arrange this. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#what-will-happen-to-my-u-tokens) **What will happen to my U tokens?** * You have the duration of the sunsetting period to access your account and send any U token rewards to an Arweave wallet address if you're eligible to withdraw rewards. (To be eligible, you need to have either topped up or previously subscribed to an Akord plan) ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#can-i-buy-more-permanent-storage) **Can I buy more permanent storage?** * No, we are no longer accepting payments for permanent storage top ups. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#can-new-users-sign-up) **Can new users sign up?** * No, we are no longer accepting new sign ups to the Akord app on Arweave. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#how-can-i-upload-new-data-to-arweave-after-akord-is-sunset) **How can I upload new data to Arweave after Akord is sunset?** * We recommend using [Ardrivearrow-up-right](https://ardrive.io/) . They have a web app, mobile app and suite of developer tools. They have an outstanding team provide excellent services for uploading to Arweave. ### [hashtag](https://docs.akord.com/introduction/akord-arweave-sunsetting-faqs#will-the-akord-api-and-sdk-on-arweave-also-be-sunset) **Will the Akord API and SDK on Arweave also be sunset?** * Yes, the Akord API and SDK to Arweave will be sunset over the same 6-month period. Last updated 1 year ago --- # Simple API upload | Akord docs You just need two things to get started: 1. [Create your account in secondsarrow-up-right](https://v2.akord.com/signup) (100 MB free to test your workflow) 2. [Get your API key herearrow-up-right](https://v2.akord.com/account/developers) ### [hashtag](https://docs.akord.com/api-and-dev-tools/simple-api-upload#example-1.1.-minimal-upload) **Example 1.1.** Minimal upload Bash JavaScript Python Copy curl --location 'https://api.akord.com/files' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: text/plain' \ --data '@/path/to/your/file.txt' Copy const fs = require('fs').promises; const data = await fs.readFile('/path/to/your/file.txt', 'utf8'); //nodejs specific const response = await fetch('https://api.akord.com/files', { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, body: data }) Copy import requests with open('/path/to/your/file.txt', 'r', encoding='utf-8') as file: data = file.read() response = requests.post( url='https://api.akord.com/files', headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, data=data ) That's it! You just uploaded the file to Arweave. Here is the example response: Copy { "id": "a6f1fbfc-403d-4607-b648-4b949fdd50bd", //technical id of upload. can be used to get metadata of the upload or file binary from cloud storage "mime_type": "text/plain", //depends on content-type of upload, goes as a tag "sizeInBytes": 10, "cloud": { "uri": "a6f1fbfc-403d-4607-b648-4b949fdd50bd", //same as ID "url": "https://api.akord.com/files/a6f1fbfc-403d-4607-b648-4b949fdd50bd" //url to binary served from cloud storage }, "tx": { "id": "LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E", //fixed ID of Arweave transaction (ANS-104 data item ID) "status": "scheduled", //indicates where is your file in Arweave bundling context //scheduled - file is in our cloud storage and is scheduled for ANS-104 //verification - file is being verified for malicious content //blocked - file is recognized as malicious, won't go to Arweave //pending - file was bundled and posted to Arweave //confirmed - file is confirmed on Arweave //rejected - this indicates a technical problem with our bundling service) "tags": [], //your Arweave tags appended to transaction "statusUrl": "https://api.akord.com/files/a6f1fbfc-403d-4607-b648-4b949fdd50bd/status", //check file status endpoint, returns simillar JSON schema "gatewayUrls": [\ "https://akrd.net/LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E", \ //our instance of Arweave gateway - this url will work always, even right after upload since it falls back to cloud storage when file is not yet on Arweave\ "https://arweave.net/LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E" \ // other Arweave gatways\ ] "viewblockUrl": "https://viewblock.io/arweave/tx/LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E", //see your file on Viewblock - this url will only work when file is in 'committed' status & indexed by Viewblock "info": "Transaction is visible on the blockchain indexers when in the \"committed\" status.", "infoUrl": "https://docs.akord.com/api-and-dev-tools/build/akord-api/files" } } ### [hashtag](https://docs.akord.com/api-and-dev-tools/simple-api-upload#example-1.2.-upload-with-arweave-transaction-tags) **Example 1.2.** Upload with Arweave transaction tags To add tags to your Arweave transaction - use query params. Each query param with key prefixed with `tag-` is treated as Arweave transaction tags. Tags query params are case sensitive. E.g. `tag-file-category=photo` => Tag name: 'file-category', Tag value: 'photo' `Tag-File-Category=PHOTO` => Tag name: 'File-Category', Tag value: 'PHOTO' Bash Javascript Python Copy curl --location 'https://api.akord.com/files?tag-file-category=photo&tag-file-description=wedding%202024' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: image/png' \ --data '@/path/to/your/file.png' Copy const fs = require('fs').promises; const data = await fs.readFile('/path/to/your/file.txt', 'utf8'); //nodejs specific const response = await fetch('https://api.akord.com/files?tag-file-category=photo&tag-file-description=wedding%202024', { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, body: data }) Copy import requests with open('/path/to/your/file.txt', 'r', encoding='utf-8') as file: data = file.read() response = requests.post( url='https://api.akord.com/files?tag-file-category=photo&tag-file-description=wedding%202024', headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, data=data ) Copy { "id": "a2a48bc6-7e9f-48c6-abc7-9e641390680b", "mimeType": "image/png", "sizeInBytes": 437432, "cloud": { "uri": "a2a48bc6-7e9f-48c6-abc7-9e641390680b", "url": "https://api.akord.com/files/a2a48bc6-7e9f-48c6-abc7-9e641390680b" }, "tx": { "id": "ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo", "status": "scheduled", "tags": [\ {\ "name": "file-category",\ "value": "photo"\ },\ {\ "name": "file-description",\ "value": "wedding 2024"\ }\ ], "statusUrl": "https://api.akord.com/files/a2a48bc6-7e9f-48c6-abc7-9e641390680b/status", "gatewayUrls": [\ "https://akrd.net/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo",\ "https://arweave.net/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo"\ ], "viewblockUrl": "https://viewblock.io/arweave/tx/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo", "info": "Transaction is visible on the blockchain indexers when in the \"committed\" status.", "infoUrl": "https://docs.akord.com/api-and-dev-tools/build/akord-api/files" } } ### [hashtag](https://docs.akord.com/api-and-dev-tools/simple-api-upload#example-1.3.-upload-with-arweave-transaction-tags-encoded) **Example 1.3.** Upload with Arweave transaction tags (encoded) You may encode your tags as base64 string and pass it as a single param Bash Javascript Python Copy base64_encoded_tags=$(echo -n '[\ {\ "name": "file-category",\ "value": "photo"\ },\ {\ "name": "file-description",\ "value": "wedding 2024"\ }\ ]' | base64) # Use in querystring curl --location 'https://api.akord.com/files?tags=$base64_encoded_tags' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: image/png' \ --data '@/path/to/your/file.png' # Or use in header curl --location 'https://api.akord.com/files' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: image/png' \ --header 'Tags: $base64_encoded_tags' \ --data '@/path/to/your/file.png' Copy const fs = require('fs').promises; const tags = [\ {\ name: "file-category",\ value: "photo"\ },\ {\ name: "file-description",\ value: "wedding 2024"\ }\ ]; const jsonTags = JSON.stringify(tags); const base64EncodedTags = Buffer.from(jsonTags).toString('base64url'); const data = await fs.readFile('/path/to/your/file.txt', 'utf8'); //nodejs specific //Use in querystring const response = await fetch(`https://api.akord.com?tags=${base64EncodedTags}`, { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, body: data }) //Or use in header const response = await fetch(`https://api.akord.com`, { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' 'Tags': base64EncodedTags }, body: data }) Copy import json import base64 import requests tags = [\ {\ "name": "file-category",\ "value": "photo"\ },\ {\ "name": "file-description",\ "value": "wedding 2024"\ }\ ] json_tags = json.dumps(data).encode('utf-8') base64_encoded_tags = base64.urlsafe_b64encode(json_data).decode('utf-8') with open('/path/to/your/file.txt', 'r', encoding='utf-8') as file: data = file.read() #Use in querystring response = requests.post( url=f"https://api.akord.com?tags={base64_encoded_tags}", headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, data=data ) #Or use in header response = requests.post( url=f"https://api.akord.com", headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain', 'Tags': base64_encoded_tags }, data=data ) Check out examples of multipart uploads for larger files here: [Multipart uploadschevron-right](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/multipart-uploads) Last updated 1 year ago --- # Learn | Akord docs [Akord protocolchevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol) [Publishing a websitechevron-right](https://docs.akord.com/api-and-dev-tools/learn/publishing-a-website) [Technical Litepaperchevron-right](https://docs.akord.com/api-and-dev-tools/learn/technical-litepaper) [End-to-end encryptionchevron-right](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption) [Bundlingchevron-right](https://docs.akord.com/api-and-dev-tools/learn/bundling) Last updated 2 years ago --- # Tags | Akord docs ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#smart-contract-interaction-tx-tags) Smart Contract interaction tx tags * `Client-Name` a client name string, ex: Akord-App * `Protocol-Name` a protocol name string, the name for the protocol is `Akord` * `Protocol-Version` a version string, the version for the protocol is `1.0.0` * `Timestamp` a [datearrow-up-right](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now) string, ex: `1654181657337` * `Function-Name` a function name string, ex: `membership:revoke` * `Vault-Id` a vault id string, smart contract id * `Membership-Id` a vault id string, smart contract id * `Member-Address` a membership address, used for functions:`vault:init` & `membership:invite` * `Node-Id` a node id string, smart contract id * `Node-Type` a string defining type of node, ex: `Stack`, `Folder`, `Memo` * `Public` a boolean string, `true` or `false` #### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#tags-inherited-from-smartweave-protocol) Tags inherited from SmartWeave Protocol * `App-Name` a string which value is `SmartWeaveAction` * `App-Version` a string which value is `0.3.0` * `Contract` a vault id string, smart contract (vault) id * `Input` user input stringified JSON ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#data-point-tx-tags) Data point tx tags * `Data-Type` a data type string, can be `File` or `State` * `Content-Type` a [data content typearrow-up-right](https://github.com/ArweaveTeam/arweave-standards/blob/master/best-practices/BP-105.md) string, used to serve data over HTTP * `Signer-Address` a signer public address string for signature verification purposes * `Signature` a signature of data content #### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#encryption-tags) Encryption tags * `Initialization-Vector` a random starting variable used for encryption * `Encrypted-Key` data encryption key (encrypted for the vault public address) * `Public-Address` a vault public address #### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#file-specific-tags) File specific tags * `File-Name` a file name string, only for public files * `File-Size` a file size in bytes * `File-Modified-At` a [datearrow-up-right](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now) string when the file was last edited, ex: `1654181657337` * `File-Type` a file size in bytes * `File-Hash` a file digest ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#smart-contract-initialisation-tx-tags) Smart Contract initialisation tx tags * `Client-Name` a client name string, ex: Akord-App * `Protocol-Name` a protocol name string, the name for the protocol is `Akord` * `Protocol-Version` a version string, the version for the protocol is `1.0.0` * `Timestamp` a [datearrow-up-right](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now) string, ex: `1654181657337` #### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#tags-inherited-from-smartweave-protocol-1) Tags inherited from SmartWeave Protocol * `App-Name` a string which value is `SmartWeaveContract` * `App-Version` a string which value is `0.3.0` * `Contract-Src` a string with transaction id with Akord Protocol code source * `Content-Type` a string which value is `application/json` ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#smart-contract-code-source-transaction-tags) Smart Contract code source transaction tags #### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#tags-inherited-from-smartweave-protocol-2) Tags inherited from SmartWeave Protocol * `App-Name` a string which value is `SmartWeaveContractSource` * `App-Version` a string which value is `0.3.0` * `Content-Type` a string which value is `application/javascript` Last updated 2 years ago * [Smart Contract interaction tx tags](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#smart-contract-interaction-tx-tags) * [Data point tx tags](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#data-point-tx-tags) * [Smart Contract initialisation tx tags](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#smart-contract-initialisation-tx-tags) * [Smart Contract code source transaction tags](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/tags#smart-contract-code-source-transaction-tags) --- # Akord protocol | Akord docs The Akord protocol provides secure digital vaults that live on-chain and offer the following properties. * **Permanence** supported by an auditable, immutable, durable and perpetual blockchain storage network – [Arweavearrow-up-right](https://www.arweave.org/) . * **Privacy** with technologies such as end-to-end encryption, zero knowledge encryption and homomorphic encryption, each vault can function as a secure space for its members. * **Composability** from a modular design that promotes the encapsulation of cryptographic primitives to build dynamic proof systems. Vaults are flexible and can be customized for your use case. The protocol defines how within an Akord vault groups of people can share and collaborate with files, audio, video, notes and messages. The protocol can function across generations through the use of Arweave and [SmartWeavearrow-up-right](https://github.com/warp-contracts/warp) contracts. Akord protocol consists of the vault smart contract that defines a set of valid action types – commands and their permissions. Every action within the vault is a transaction – an interaction with the corresponding vault contract instance. The owner creates the vault and can invite others, managing access to it by assigning new members as contributors or viewers. The vault owner and contributors can then share the new data within the vault. Any vault member can read this data. The data in the vault is organised in node objects where each node has its id, type, data versions and can reference another node as its parent. Last updated 2 years ago --- # Vault | Akord docs The Akord protocol is built to facilitate the creation of a vault, where one or more members can join and interact with the vault by uploading files or posting messages. The Akord vault acts as a registry, keeping track of all memberships and node lifecycles, storing the vault’s data. Last updated 2 years ago --- # Functions | Akord docs [vault:initchevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/vault/functions/vault-init) [vault:updatechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/vault/functions/vault-update) [vault:archivechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/vault/functions/vault-archive) [vault:restorechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/vault/functions/vault-restore) Last updated 2 years ago --- # Membership | Akord docs Each vault allows for members to join. Members have an assigned access level (owner, contributor, or viewer). Each time a member is added or removed, the protocol rotates the encryptions, preventing old members from viewing new data. Last updated 2 years ago --- # Node | Akord docs Abstracted as a data object in the vault, a node functions as a pointer to data within a context. Nodes contain a hash to some external data. Nodes can refer to a parent node to establish a hierarchical or group-based topography. Nodes can also refer to a previous version of itself, enabling auditing of immutable data. Last updated 2 years ago --- # Functions | Akord docs [membership:invitechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/membership/functions/membership-invite) [membership:acceptchevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/membership/functions/membership-accept) [membership:rejectchevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/membership/functions/membership-reject) [membership:revokechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/membership/functions/membership-revoke) [membership:change-rolechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/membership/functions/membership-change-role) [membership:updatechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/membership/functions/membership-update) Last updated 2 years ago --- # Fields | Akord docs * `owner` - address of the node's creator * `createdAt` - creation [timestamparrow-up-right](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now) * `updatedAt` - last updated [timestamparrow-up-right](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now) * `status` - current status among: * `ACTIVE` * `ARCHIVED` * `public` - boolean * `data` - array of all data version references * `memberships` - array of the vault's [members](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/membership) * `nodes` - array of vault's [nodes](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/node) * `evolve` - reference of the last contract code source version **Example State** Copy { "id": "Z_PVOyEb2a3RQJZXPGZuech2XNI5BGemKcSD4Hx34Wo", "owner": "9+zypjejQt17sd0dJ5MSfOLSy7kXOPsEGVetOVOUkRgZe0Zpy83Kubx/enrTwxf+djMevL0BlK0WsrR49FAyHg==","address":"9+zypjejQt17sd0dJ5MSfOLSy7kXOPsEGVetOVOUkRgZe0Zpy83Kubx/enrTwxf+djMevL0BlK0WsrR49FAyHg==", "createdAt": "1665155861820", "updatedAt": "1665155861820", "status": "ACTIVE", "public": false, "data": ["DBDq3OugivNyGAXlUVTMvnywINhWlUUkNBCCkEK9btU"], "memberships": [...], "nodes": [...], "evolve":"_02p8kf7osYuYt6U41gaK898o1SaKqEDpKZWg90jweE" } Last updated 2 years ago --- # Fields | Akord docs * `id` * `owner` - address of the node's creator * `createdAt` - creation timestamp * `updatedAt` - last update timestamp * `status` - current status among: * `ACTIVE` * `REVOKED` * `data` - array of all data version references * `parentId` - parent id reference * `type` - type for easier data querying * `tags` - array of strings **Example State** Copy { "id": "f78aa181-ca1e-4c75-8c66-969574cfdae3", "owner": "9+zypjejQt17sd0dJ5MSfOLSy7kXOPsEGVetOVOUkRgZe0Zpy83Kubx/enrTwxf+djMevL0BlK0WsrR49FAyHg==", "createdAt": "1665155869914", "updatedAt": "1665155885111", "type": "Folder", "status": "ACTIVE", "parentId": "e31_XvjID79GZRK3-h9uddWVl5wPM7Fsa8dr580GNVo", "data": ["M5v6QTVu_M5f0lVDfpyOZAlZ-fu84kLuOKEje_jKlag"] } Last updated 2 years ago --- # Fields | Akord docs * `id` * `owner` - address of the node's creator * `address` - member's address * `createdAt` - creation timestamp * `updatedAt` - last updated timestamp * `status` - current status among: * `ACTIVE` * `PENDING` * `REJECTED` * `REVOKED` * `role` - member role among: * `OWNER` * `CONTRIBUTOR` * `VIEWER` * `data` - array of all data version references **Example State** Copy { "id": "0c4d8b53-04b2-44eb-b997-463a4a2a0b6f", "owner": "9+zypjejQt17sd0dJ5MSfOLSy7kXOPsEGVetOVOUkRgZe0Zpy83Kubx/enrTwxf+djMevL0BlK0WsrR49FAyHg==","address":"9+zypjejQt17sd0dJ5MSfOLSy7kXOPsEGVetOVOUkRgZe0Zpy83Kubx/enrTwxf+djMevL0BlK0WsrR49FAyHg==", "createdAt": "1665155861820", "updatedAt": "1665155861820", "role": "OWNER", "status": "ACCEPTED", "data": ["E-mFgrjxO2VO0Juo3B2ntw_ldMBLXgx3SJbLZipjPgI"] } Last updated 2 years ago --- # Functions | Akord docs [node:createchevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/node/functions/node-create) [node:updatechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/node/functions/node-update) [node:movechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/node/functions/node-move) [node:revokechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/node/functions/node-revoke) [node:restorechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/node/functions/node-restore) [node:deletechevron-right](https://docs.akord.com/api-and-dev-tools/learn/akord-protocol/node/functions/node-delete) Last updated 2 years ago --- # Technical Litepaper | Akord docs Our technical Litepaper is written for builders, giving an overview of the protocol, as well as our thinking in regards to web3, storage and data ownership. View and download the pdf here: file-pdf 206KB [Akord Litepaper.pdf](https://1593374540-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0GR33YblhLmalhKSoV1D%2Fuploads%2F1A2zqgsrszDpOZYj28X6%2FAkord%20Litepaper.pdf?alt=media&token=ae2870e0-5981-4c0f-9430-6b1b3d6eafa0) PDF downloadDownload[arrow-up-right-from-squareOpen](https://1593374540-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0GR33YblhLmalhKSoV1D%2Fuploads%2F1A2zqgsrszDpOZYj28X6%2FAkord%20Litepaper.pdf?alt=media&token=ae2870e0-5981-4c0f-9430-6b1b3d6eafa0) Last updated 2 years ago --- # Troubleshooting website publishing | Akord docs 1. If you're unable to load files from your HTML, make sure that the links are relative to the root. For example if you have a folder named photos you would use `src="photos/photo1.jpg` or if you're accessing a file from the root `href="index.html"` 2. Ensure that your manifest.json file was generated after uploading your files. You can generate manifests multiple times, each time receiving a unique URL that represents a snapshot of the vault's state at that particular time." 3. Wait for the transactions to confirm on the Arweave blockchain before attempting to access your site. This may take a few minutes up to an hour. 4. Make sure to choose the permaweb url from the File Info menu from `manifest.json`. You can also choose to access the permaweb via `https://arweave.net/`. The `file tx id` is found under the 'File Info' menu. 5. If you encounter any errors, refer to the Arweave documentation or our [Community Discord channelarrow-up-right](https://discord.com/invite/g4VXfauK5s) for support. Last updated 2 years ago --- # Bundling | Akord docs In Arweave world bundling means putting multiple files (called data items) into one bag (a bundle) and posting it as one Arweave transaction. Each file in the bundle is signed. In principle bundle transaction is same as standard Arweave transaction - it has tags in header and binary in body. What makes it special is that it follows accepted Arweave standard - [ANS-104arrow-up-right](https://github.com/ArweaveTeam/arweave-standards/blob/master/ans/ANS-104.md) . This standard allows for combining files signed files (with tags included) into single Arweave transaction and posting it as such to Arweave node. That standard puts additional complexity on Arweave chain indexers to unbundle the transactions when detecting bundles and indexing data items. Besides additional complexity bunding brings advantages: * Allows for separation of roles: signer & payer. This is how Akord works! You sign your data -> we post it to Arweave and paying with our Arweave hot wallet so that you don't need to maintain it. * Reduces risk of dropping transaction. Imagine uploading thousands of files: simple networking problems may cause few files to be rejected. It's more reliable to bundle e.g. 500 files into single transaction. See [example on viewblockarrow-up-right](https://viewblock.io/arweave/tx/OUgbt2Z-vciE0ef133vJ1LePhnFDvyl6rfyMmIzi5MQ) * Guarantees fixed, deterministic transaction ID after signing the file (data item ID). Since data items are treated as normal Arweave transactions by indexers, the moment you sign the binary stamps the identifier to the resulting data item. That identifier is transaction ID of resulting data item transaction ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/bundling#bundlers) Bundlers Who is bundling data in Arweave ecosystem? Technically any user of Arweave network can sign files, bundle data items according to ANS-104 standard and post it as such to Arweave network. That process is streamlined but its completely irrelevant for users of Arweave network that simply prefer to use Arweave and not develop code with it. Akord runs Arweave bundling service that takes care of bundling and posting your signed files. Here are few technical rules that we apply in bundling process: * bundle can have maximum 150mb (files bigger than that are posted as single data items in transaction) * bundle can be composed of maximum 500 data items * bundles are composed in 2 minutes time window - this does not mean we post bundles exactly every 2 minutes. That may be the case but not necessary. In simply depends on the traffic. We open "bundling" window with the moment of first upload and close it after 2 minutes if not closed before by any other factor. Last updated 1 year ago --- # Publishing a website | Akord docs Publishing static websites to the permaweb using Akord is a great way to ensure that your website remains available permanently without the risk of it being taken down. With Akord, you can easily create a public vault, upload your website files, and generate a manifest to create a permaweb link for your website. In this tutorial, we will guide you through the steps required to publish a static website to the permaweb using Akord. Let's start! 1. **Create a Public Vault:** To create a public vault, open [v2.akord.comarrow-up-right](http://v2.akord.com/) and log in to your account. Click on the "New Vault" button, select the "Public" option, and name your vault. 2. **Upload an "index.html" file:** To upload your index.html file, click on the "Upload a File" or "+" button and select the file. Below is an example of what your index.html file may contain: Copy Permaweb Website

Welcome to My Permaweb Website

1. **Create a folder titled "styles":** To create a folder titled "styles", click on the "+" button, select "Create Folder" and enter "styles" as the folder name. 2. **Upload the styles.css file to the "styles" folder:** To upload the styles.css file to the "styles" folder, click on the folder and select the "Add File" from the "+" button. Below is an example of what your styles.css file may contain: Copy body { background-color: #f2f2f2; } h1 { color: #c84343; align-items: center; text-align: center; font-family: Georgia; } **Generate a manifest** At this point, you should have a public vault with an index.html in the root, and a styles.css file in the styles folder. Next let's generate a manifest that will instruct the Arweave gateways to render this vault as a public website. 1. **Add a manifest:** To add a manifest, click on the "+" button and select "Add Manifest". Once completed, you'll find a 'manifest.json' file in your vault. This file lists all the contents in your vault, assigning the file's on chain hash with a friendly name provided by the Akord vault. 2. **Wait for the transactions to confirm on the Arweave blockchain**: While pending the file name will appear with a small orange dot. You can check on its status by selecting "Storage" from the left nav menu. 3. **Find the permaweb link to your websites:** Once the transactions are confirmed, go to your vault, select the manifest.json file menu on the right, and click on "File Info". Copy the permaweb link. 4. **Open the URL in your web browser:** Open your web browser and paste the permaweb link to view your static website. Akord makes it easy to publish static websites to the permaweb, which is an excellent way to ensure that your website remains available permanently. By following the above steps, you can easily publish your website to the permaweb and share it with the world. Last updated 2 years ago --- # Build | Akord docs [REST APIchevron-right](https://docs.akord.com/api-and-dev-tools/build/rest-api) [SDK – AkordJSchevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs) [CLIchevron-right](https://docs.akord.com/api-and-dev-tools/build/cli) [Arweave Gateway – AKRDchevron-right](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd) Last updated 1 year ago --- # REST API | Akord docs With the REST API you can: * automate uploads to Arweave with 0 code dependencies (no new libs in your code, just a simple HTTP) * track the status of your uploads to Arweave * setup webhooks to receive notifications on Arweave tx events * get a simple, versatile storage solution – use both Cloud and Permanent storage classes. A list of all public and supported operations of the REST API can be found [herearrow-up-right](https://api.akord.com/docs) . Last updated 2 years ago --- # Rate limits | Akord docs Akord imposes restrictions on the number of REST API requests permitted within a designated timeframe. We do that to mitigate potential abuse and to block denial-of-service attacks. Other than general limits, the API allows a specific number of requests in time windows per subscription plan. Those limits are in place because of our infrastructure costs – higher requests rate generates bigger costs. You can find up-to-date API limits for each subscription plan on [our pricing pagearrow-up-right](https://akord.com/pricing) . `HTTP 429` is the API response that indicates crossing the API limit from your current plan. If you start receiving such responses, you may consider [upgrading your subscription planarrow-up-right](https://v2.akord.com/account/plans-and-payments/pricing-plans) or lowering the request rate. Last updated 2 years ago --- # SDK – AkordJS | Akord docs The main features of AkordJS include: * ability to work on the browser and server * uploading your files to Arweave and cloud storage * encrypt and decrypt your content: metadata and binaries * providing easy access to all Akord contract features * handling authentication – JWT and API key. [Check out the Github repo of our SDK herearrow-up-right](https://github.com/Akord-com/akord-js) . Last updated 2 years ago --- # Timeouts | Akord docs HTTP calls to REST API are timed out after 30 seconds. HTTP calls to upload the binary to Akord storage are timed out after 180 seconds. To upload files that require longer HTTP connection use [multipart uploads](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/multipart-uploads) . HTTP calls to download the binary from Akord storage are kept alive until the file is fully downloaded. Last updated 2 years ago --- # End-to-end encryption | Akord docs [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#why-end-to-end-encryption) Why end-to-end encryption? ----------------------------------------------------------------------------------------------------------------------------------------- Many service providers offer encryption in transit (HTTPS connection) and encryption at rest (data is stored encrypted on the servers). However, this does not prevent third parties from accessing sensitive user data. For example, company employees, selling data for advertising purposes or a server attacked by hackers. End-to-end encryption ensures that the only ones who have the ability to decrypt the data are the sender and receiver. No [encryption backdoorarrow-up-right](https://protonmail.com/blog/encryption-backdoor/) is possible. There are two types of end-to-end encryption: symmetric and asymmetric. [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#symmetric-encryption) Symmetric encryption ------------------------------------------------------------------------------------------------------------------------------ The data is encrypted and decrypted with the same unique [symmetric keyarrow-up-right](https://en.wikipedia.org/wiki/Symmetric-key_algorithm) . So the encryption requires the knowledge of the key by the sender and the receiver. The challenge is to exchange this key securely while preventing it from falling into the hands of a third party. ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FCjv0DphL5TfdDV2Nw39M%252Fsymmetric-key.png%3Falt%3Dmedia%26token%3D740dee52-4087-472b-a0dd-cdf46ca5fa16&width=768&dpr=3&quality=100&sign=bea573f&sv=2) ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#asymmetric-encryption) Asymmetric encryption With asymmetric encryption each participant has their own public & private key pair to communicate. The public key can be openly distributed, while the private key should be kept secret. The data is encrypted with the recipient’s public key, so that it can only be decrypted with their private key. Although asymmetric encryption is considerably less efficient than symmetric encryption, its main advantage is that it does not require prior key agreement and thus the key exchange can be safely carried out through the network. ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FtGLrRaylxYtM3EyHsHyb%252Fasymmetric.png%3Falt%3Dmedia%26token%3D65627547-800d-4b71-ae83-c67146780c57&width=768&dpr=3&quality=100&sign=ac3cd3a5&sv=2) ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#akords-encryption) Akord’s encryption In addition to encryption in transit and encryption at rest, all exchanged data on Akord is end-to-end encrypted. In other words, everything is encrypted locally, before it ever leaves your device. We use industry standard algorithms to perform all cryptographic operations. For performance, we use hybrid encryption, meaning that data is encrypted using a unique symmetric key, and then that key is encrypted with the recipient's public key using asymmetric encryption. It also means that encrypted data can be stored in the cloud once, and access to it can be managed at the key re-encryption level. Both the symmetric and asymmetric encryption we use apply authentication under the hood, so that data integrity is always ensured and cannot be tampered with. ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#cryptographic-primitives) Cryptographic primitives Cryptographic primitives are well-established algorithms that are commonly used to build cryptographic protocols for security systems. ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#hash-function) **Hash function** We use [**SHA-256**arrow-up-right](https://en.wikipedia.org/wiki/SHA-2) for hashing the data, that is, generating a deterministic digest. * library: [WebCrypto APIarrow-up-right](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest) * algorithm: SHA-256 ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#key-derivation-function) **Key derivation function** To obtain a strong encryption key from a user password, we use the Password-Based Key Derivation Function 2 ([**PBKDF2**arrow-up-right](https://www.pbkdf2.com/) **)** by adding a random salt to the password and performing 150000 iterations of the **SHA-256** hash function. * library: [WebCrypto APIarrow-up-right](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey) * algorithm: PBKDF2 with [HMAC-SHA-256arrow-up-right](https://en.wikipedia.org/wiki/HMAC) ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#symmetric-encryption-1) **Symmetric encryption** Any data exchanged within the Akord system is encrypted using a unique, randomly generated symmetric key via [AES256-GCMarrow-up-right](https://www.aes-gcm.com/) with a random initialisation vector (IV) prepended to the encrypted data. * library: [WebCrypto APIarrow-up-right](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt) * algorithm: AES256-GCM ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#asymmetric-encryption-1) **Asymmetric encryption** We use asymmetric encryption for data access control, the symmetric keys used to encrypt the actual data are then encrypted with the recipient's public key by performing a [**Diffie**arrow-up-right](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) [**–**arrow-up-right](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) [**Hellman**arrow-up-right](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) (DH) key exchange on a [**Curve25519**arrow-up-right](https://en.wikipedia.org/wiki/Curve25519) elliptic curve. An ephemeral key pair is generated to establish a key agreement. Once the symmetric key is agreed upon, the data is encrypted using [**XSalsa20**arrow-up-right](https://www.xsalsa20.com/) stream cipher. A random, unique [noncearrow-up-right](https://en.wikipedia.org/wiki/Cryptographic_nonce) is also generated and used for [**Poly1305 MAC**arrow-up-right](https://www.poly1305.com/) authentication. * library: [libsodiumarrow-up-right](https://libsodium.gitbook.io/doc/public-key_cryptography/authenticated_encryption) * algorithms: * key exchange: X25519 * encryption: XSalsa20 stream cipher * authentication: Poly1305 MAC ### [hashtag](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#digital-signatures) Digital signatures All data is signed using the [**Edwards-Curve Digital Signature Algorithm**arrow-up-right](https://en.wikipedia.org/wiki/EdDSA) [(arrow-up-right](https://en.wikipedia.org/wiki/EdDSA) [**EdDSA**arrow-up-right](https://en.wikipedia.org/wiki/EdDSA) [)arrow-up-right](https://en.wikipedia.org/wiki/EdDSA) with the **SHA-512** hash function and **Curve25519** elliptic curve. * library: [libsodiumarrow-up-right](https://libsodium.gitbook.io/doc/public-key_cryptography/public-key_signatures) * algorithm: Ed25519 Last updated 2 years ago * [Why end-to-end encryption?](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#why-end-to-end-encryption) * [Symmetric encryption](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#symmetric-encryption) * [Asymmetric encryption](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#asymmetric-encryption) * [Akord’s encryption](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#akords-encryption) * [Cryptographic primitives](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#cryptographic-primitives) * [Hash function](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#hash-function) * [Key derivation function](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#key-derivation-function) * [Symmetric encryption](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#symmetric-encryption-1) * [Asymmetric encryption](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#asymmetric-encryption-1) * [Digital signatures](https://docs.akord.com/api-and-dev-tools/learn/end-to-end-encryption#digital-signatures) --- # Webhooks | Akord docs Some of the REST API operations have an asynchronous nature, for example, uploading a file to Akord's permanent storage. The REST API gives a direct, synchronous response informing you about the file, being successfully uploaded with a payload containing a fixed transaction ID of thecorresponding Arweave blockchain transaction. The problem with that transaction ID: it is unusable for the next few minutes, until the transaction is confirmed on the Arweave blockchain. To know when your transaction is confirmed, you can poll the REST API's status endpoint. That's one, simple solution, that could generate some network traffic. Webhooks to the rescue! Webhooks allow your applications to receive events as they occur in your Akord accounts, so that your back-end systems can execute actions accordingly. To enable webhook events, you need to register webhook endpoints. Registering can be done on the frontend app or directly using the REST API. After you register them, Akord will push real-time event data to your application’s webhook endpoint when events happen in your Akord account. Webhook uses HTTPS to send events to your app with a JSON payload that includes an event object. #### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/webhooks#supported-events) Supported events * `transaction.commited` Event object: Copy { "event": "transaction.commited", "id": "a2a48bc6-7e9f-48c6-abc7-9e641390680b", "mimeType": "image/png", "sizeInBytes": 437432, "cloud": { "uri": "a2a48bc6-7e9f-48c6-abc7-9e641390680b", "url": "https://api.akord.com/files/a2a48bc6-7e9f-48c6-abc7-9e641390680b" }, "tx": { "id": "ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo", "status": "committed", "tags": [\ {\ "name": "file-category",\ "value": "photo"\ },\ {\ "name": "file-description",\ "value": "wedding 2024"\ }\ ], "statusUrl": "https://api.akord.com/files/a2a48bc6-7e9f-48c6-abc7-9e641390680b/status", "gatewayUrls": [\ "https://akrd.net/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo",\ "https://arweave.net/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo"\ ], "viewblockUrl": "https://viewblock.io/arweave/tx/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo", "info": "Transaction is visible on the blockchain indexers when in the \"committed\" status.", "infoUrl": "https://docs.akord.com/api-and-dev-tools/build/akord-api/files" } } By adding a webhook url, you will receive the events from single supported event type. _Future releases of the API will bring more events with subscribe filter option_ Last updated 2 years ago --- # Examples | Akord docs This section shows the following REST API usage examples. * [Simple uploads](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads) – the quickest way of uploading files to Arweave (or use Akord's cloud storage for staging and temporary storage). * [Multipart uploads](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/multipart-uploads) – upload your files in chunks. For more examples, visit our [REST API tests repoarrow-up-right](https://github.com/Akord-com/akord-api-e2e) Last updated 2 years ago --- # Authentication | Akord docs Since Akord As a user of Akord's REST API, you may authenticate using the following methods: * JSON Web Tokens – short-lived tokens * API keys - long life, revokable keys Both authentication methods are working interchangeably. Choosing the authentication method depends of your use case. It is not recommended to use personal API key on customer facing client-side apps (eg, your frontend app that possibly requires Akord storage) because of the risk of compromising the key. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/authentication#json-web-tokens) JSON Web Tokens You may issue Jason Web Tokens (JWT) using your credentials but not with a simple password grant. Instead, we promote Secure Remote Protocol (SRP), which prevents the password from leaving your machine. Since SRP is little bit more demanding for client negotiating tokens we encapsulate the SRP client-side logic in CLI. _Future releases of this doc may bring pure HTTP token negotiation._ **Prerequisite** Copy npm i -g @akord/akord-cli **Issue new token** _This shows as well how to call the CLI from from a non-shell env_ Bash JavaScript Python Copy akord login -p -t Copy const { spawn } = require('child_process'); const command = 'akord'; const args = ['login', email, '-p', password, '-t']; const process = spawn(command, args); process.stdout.on('data', (data) => { console.log('JWT:', data.toString()); }); process.stderr.on('data', (data) => { console.error('Error:', data.toString()); }); Copy import subprocess command = ['akord', 'login', email, '-p', password, '-t'] process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() print("JWT:", stdout.decode()) print("Error:", stderr.decode()) **Use the token** Put the JWT, prefixed with `Bearer` into `Authorization` header of HTTP request to REST API, for example: Bash JavaScript Python Copy curl -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_token" https://api.akord.com/storage-balance Copy const response = await fetch('https://api.akord.com/storage-balance', { method: 'GET', headers: { 'Accept': 'application/json', 'Authorization': 'Bearer your_jwt', 'Content-Type': 'application/plain' } }) Copy import requests response = requests.get( url='https://api.akord.com/storage-balance', headers={ 'Accept': 'application/json', 'Authorization': 'Bearer your_jwt', 'Content-Type': 'applicaiton/json' } ) ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/authentication#api-key) API Key **Generate API Key** Typically, you would generate / rotate the API key using our frontend app: [https://v2.akord.com/account/developersarrow-up-right](https://v2.akord.com/account/developers) You can also use the API directly to issue an API Key: Bash JavaScript Python **Use the API Key** Put the API Key into `Api-Key` header of HTTP request to REST API, for example: Bash JavaScript Python Last updated 2 years ago * [JSON Web Tokens](https://docs.akord.com/api-and-dev-tools/build/rest-api/authentication#json-web-tokens) * [API Key](https://docs.akord.com/api-and-dev-tools/build/rest-api/authentication#api-key) Copy curl -X PUT \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_token" https://api.akord.com/api-keys Copy const response = await fetch('https://api.akord.com/api-keys', { method: 'PUT', headers: { 'Accept': 'application/json', 'Authorization': 'Bearer your_jwt', 'Content-Type': 'application/plain' } }) Copy import requests response = requests.put( url='https://api.akord.com/api-keys', headers={ 'Accept': 'application/json', 'Authorization': 'Bearer your_jwt', 'Content-Type': 'applicaiton/json' } ) Copy curl -X GET \ -H "Content-Type: application/json" \ -H "Api-Key: your_api_key" https://api.akord.com/storage-balance Copy const response = await fetch('https://api.akord.com/storage-balance', { method: 'GET', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'application/plain' } }) Copy import requests response = requests.get( url='https://api.akord.com/storage-balance', headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'applicaiton/json' } ) --- # Modules | Akord docs [Authchevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/auth) [Vaultchevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault) [Membershipchevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership) [Folderchevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder) [Stack (file)chevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file) [Manifestchevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/manifest) [Notechevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note) [Memo (message)chevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/memo-message) [Batchchevron-right](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/batch) Last updated 2 years ago --- # Usage | Akord docs ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#import) Import > requires Node.js 16 Copy import { Akord } from "@akord/akord-js"; or Copy const { Akord } = require("@akord/akord-js"); ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#quick-start) Quick start #### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#init-akord) Init Akord **with email & password** Copy import { Auth, Akord } from "@akord/akord-js"; const { wallet, jwt } = Auth.signIn(email, password); const akord = Akord.init(wallet); **with Akord Wallet & JWT** Copy const akord = Akord.init(wallet, { authToken: jwt }); #### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#create-vault) Create vault Copy const { vaultId } = await akord.vault.create("my first vault"); #### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#upload-file-to-the-vault-by-creating-new-stack) Upload file to the vault by creating new stack #### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#download-the-latest-stack-version) Download the latest stack version #### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#query-user-vaults) Query user vaults ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#more-examples) More examples See our [demo app tutorialarrow-up-right](https://akord-js-tutorial.akord.com/) and learn how to create, contribute and access an Akord Vault. We also have some example flows in our [tests repositoryarrow-up-right](https://github.com/Akord-com/akord-js/tree/main/src/__tests__) . Last updated 2 years ago * [Import](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#import) * [Quick start](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#quick-start) * [More examples](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/usage#more-examples) Copy const { stackId, uri } = await akord.stack.create(vaultId, file); Copy const filePath = await akord.stack.download(stackId); Copy const vaults = await akord.vault.listAll(); --- # Examples | Akord docs ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/examples#tutorial-create-a-permanent-diary-on-arweave) Tutorial – create a permanent diary on Arweave In this tutorial, we'll cover the basics for how to create, contribute to and access an Akord vault. * **Wallet**: demonstration of how to access your Akord wallet. * **Gallery**: how to access a public vault and display a photo gallery. * **Diary**: how to build a private/permanent diary. [👉 Launch the demo app tutorialarrow-up-right](https://js.akord.com/) ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/examples#other-examples) Other examples We also have some example flows in our [tests repositoryarrow-up-right](https://github.com/Akord-com/akord-js/tree/main/src/__tests__) . Last updated 2 years ago * [Tutorial – create a permanent diary on Arweave](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/examples#tutorial-create-a-permanent-diary-on-arweave) * [Other examples](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/examples#other-examples) --- # Arweave Gateway – AKRD | Akord docs An Arweave gateway is an HTTP accessible service with a single purpose: to make it easy for users to interact with the Arweave network. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#features) Features * HTTP access to L1 transactions data on Arweave network * HTTP access to unbundled transactions data on Arweave network (See [bundling](https://docs.akord.com/api-and-dev-tools/learn/bundling) ) * Indexing and serving GraphQL index of transactions * HTTP API: [https://akrd.io/api-docsarrow-up-right](https://akrd.io/api-docs/) ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#hosts) Hosts Akord maintains an [AR-IO gatewayarrow-up-right](https://github.com/ar-io/ar-io-node) node: [https://akrd.netarrow-up-right](https://akrd.net/) akrd.net is a gateway node with CloudFront, optimistic and service caching layers. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#caching) Caching Serving data directly from the Arweave network is not practical for most use cases. To improve performance of the gateway we offer caching layers: * **CloudFront cache layer** Caches content at edge locations closer to users, speeding up delivery by serving subsequent requests from these caches rather than the origin server. To omit CloudFront cache layer, you may append a unique query string parameter to the URL for each request e.g. _https://akrd.net/5CXiXTTcYsvmzGZKz\_bHgi\_v3propbsj18xM6tEk1zU?timestamp=_1620277252 To forbid storing data in cache use request header _Cache-Control: no-cache_ * **Optimistic cache layer** Allows use of data uploaded to Arweave before it gets confirmed on-chain and before it's indexed by Arweave chain indexers. You can use your data milliseconds after its upload. The layer is only active if data is uploaded using Akord bundling service (any Akord entry point: REST API, CLI, SDK, App). There is no TTL for this cache layer. Effectively, that's the source of the data requested the first time (_see_ CloudFront cache layer) from Akord gateway. To omit optimistic cache layer, you should use query parameter _optimistic-cache=false_ e.g. _https://akrd.net/5CXiXTTcYsvmzGZKz\_bHgi\_v3propbsj18xM6tEk1zU?optimistic-cache=false_ * **Service cache layer** The gateway service downloads the transactions data to the local disk and serves those over HTTP. Service layer cache means data is kept on local disk to serve subsequent responses without going to the Arweave network. TTL of this cache is 3 hours. This layer can not be omitted on the request level. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#sandboxing) Sandboxing When using the gateway service you may notice that it does redirects. E.g. when requesting: _https://akrd.io/5CXiXTTcYsvmzGZKz\_bHgi\_v3propbsj18xM6tEk1zU_ The gateway service responds with _HTTP 301,_ redirecting to: _https://4qs6exju3rrmxzwmmzfm75whqix67xu25cs3wi6xzrgovuje242q.akrd.io/5CXiXTTcYsvmzGZKz\_bHgi\_v3propbsj18xM6tEk1zU_ This is expected behaviour. It is a feature of the gateway, preventing MITM attacks. It is explained in detail in [AR-IO Gateway docsarrow-up-right](https://docs.ar.io/concepts/sandboxing.html#tls-and-its-role-in-browser-sandboxing) . The sandbox id (subdomain hash) is deterministically calculated on service-level based on transaction ID. This is simple Base32 encoding of txID. For the above example: ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#graphql-index) GraphQL Index Gateway nodes crawl the Arweave chain block-by-block and index transactions. Akord gateways keep index of Akord bundled transactions and can query the index with the GraphQL API. GraphQL sandbox urls: * [https://akrd.net/graphqlarrow-up-right](https://akrd.net/graphql) * [https://akrd.io/graphqlarrow-up-right](https://akrd.io/graphql) Example request: ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#rate-limiting) Rate Limiting Gateway nodes are rate limiting traffic to block HTTP flood attacks, also known as Denial of Service (DoS). Allowed non-challenge traffic rate is **1000 requests / 5 minutes per IP**. It means the gateway does not actively block requests when traffic rate is higher. Instead it responds with a challenge that must be solved on client side. This challenge is automatically solved by browser environments. Effectively this rule blocks bot sessions. Allowed challenge traffic rate is **5000 requests / 5 minutes per IP**. This is maximum, public, per IP traffic on the gateway. When this limit is crossed, gateway blocks requests, responding with _HTTP 429._ This rule holds even if valid challenge response is provided. The default rate limiting may be lifted for specific use cases. A supported way of increasing the allowed traffic is by including the Api-Key header in request. This is a custom flow and should be consulted prior to the usage. Don't hesitate to contact us! Last updated 1 year ago * [Features](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#features) * [Hosts](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#hosts) * [Caching](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#caching) * [Sandboxing](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#sandboxing) * [GraphQL Index](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#graphql-index) * [Rate Limiting](https://docs.akord.com/api-and-dev-tools/build/arweave-gateway-akrd#rate-limiting) Copy const id = '5CXiXTTcYsvmzGZKz_bHgi_v3propbsj18xM6tEk1zU'; const expectedTxSandbox = (id): string => { return toB32(fromB64Url(id)); }; console.log(expectedTxSandbox); //4qs6exju3rrmxzwmmzfm75whqix67xu25cs3wi6xzrgovuje242q Copy query { transactions( sort: HEIGHT_ASC, first: 100, after: null, tags: [\ {\ name: "Member-Address",\ values: ["os4WnmzUzsghAXP4h+zsfwCdNohcfUy0cJ1bkES42Cc5UQ2MvpL2SeHTxRlf5TfbTFRKSBaBxn72grntYwfweA=="]\ },\ {\ name: "Protocol-Name",\ values: ["Akord"]\ }\ ] ) { edges { cursor node { id tags { name value } } } pageInfo { hasNextPage } } } --- # Multipart uploads | Akord docs You may (sometimes have to) upload files in parts. This means instead of opening a single HTTP connection to transfer the whole binary to the REST API, you open multiple connections. Each HTTP connection ships part of the file. Using multipart uploads enables the following features. * Avoiding [timeouts](https://docs.akord.com/api-and-dev-tools/build/rest-api/timeouts) when uploading larger files. * Increasing the upload speed by uploading the parts concurrently. * Pausing the upload. Multipart upload is a must for uploads which require HTTP connection longer than the REST API [timeouts](https://docs.akord.com/api-and-dev-tools/build/rest-api/timeouts) . Multipart upload is recommended for uploading files that are larger than 5 MB. That size also constitutes the minimum size of the upload part (the last chunk may be smaller). The maximum number of chunks is 10,000. The sizes of chunks must be equal (the exception is the last chunk which may be smaller). The chunk size is defined with the first upload chunk, based on Content-Range header. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/multipart-uploads#example-3.-multipart-upload) **Example 3.** Multipart upload Javascript Python Copy // Get total file size const stats = await fs.promises.stat(FILE_PATH); const fileSize = stats.size; // Define function for uploading single chunk from the file const uploadChunk = async (start: number, end: number, headers: HeadersInit = {}) => { const chunkStream = fs.createReadStream('./path/to/file', { start: start, end: end }); const chunk = await arrayBuffer(chunkStream) const response = await fetch(`https://api.akord.com/files?tags=${tagsBase64Encoded}`, { method: 'POST', headers: { 'Api-Key': 'your_api_key', 'Content-Type': 'application/pdf', 'Content-Range': `bytes ${start}-${end}/${fileSize}`, ...headers }, body: chunk }); if (response.status !== 202) { throw new Error('Failed to upload first chunk of the file. Status code: ' + response.status); } return response; } // Upload first chunk of the file const response = await uploadChunk(0, CHUNK_SIZE); // Read location of the multipart upload const contentLocation = response.headers.get('Content-Location'); if (!contentLocation) { throw new Error('Content-Location header is missing'); } // Upload middle chunks of the file using 'Content-Location' & 'Content-Range' - can be done concurrently let sourceOffset = CHUNK_SIZE; const chunkUploadPromises = []; while (sourceOffset + CHUNK_SIZE < fileSize) { const chunkUploadPromise = uploadChunk(sourceOffset, sourceOffset + CHUNK_SIZE, { 'Content-Location': contentLocation }); chunkUploadPromises.push(chunkUploadPromise); sourceOffset += CHUNK_SIZE; } await Promise.all(chunkUploadPromises); // Upload last chunk of the file to complete the multipart upload const res = await uploadChunk(sourceOffset, fileSize, { 'Content-Location': contentLocation }); Response: circle-info Check out other examples in our [REST API tests repoarrow-up-right](https://github.com/Akord-com/akord-api-e2e) . You can also have a look at our [SDK codearrow-up-right](https://github.com/Akord-com/akord-js/blob/main/src/core/file.ts#L32) . Last updated 2 years ago Copy import os import requests # Get total file size file_path = './tests/data/20mb.pdf' file_size = os.path.getsize(file_path) # Define function to upload a chunk def upload_chunk(start, end, headers=None): with open(file_path, 'rb') as file: file.seek(start) chunk = file.read(end - start + 1) headers = headers or {} headers['Content-Range'] = f'bytes {start}-{end}/{file_size}' headers['Content-Type'] = 'application/pdf' headers['Authorization'] = 'Bearer ' response = requests.post(f'{os.environ["BASE_URL"]}/files?tags={tags_base64_encoded}', data=chunk, headers=headers) print("Uploaded chunk:", f'bytes {start}-{end}/{file_size}') if response.status_code != 202: raise ValueError('Failed to upload chunk of the file. Status code: ' + str(response.status_code)) return response # Upload first chunk of the file response = upload_chunk(0, CHUNK_SIZE) # Read location of the multipart upload content_location = response.headers.get('Content-Location') if not content_location: raise ValueError('Content-Location header is missing') # Upload middle chunks of the file using 'Content-Location' & 'Content-Range' - can be done concurrently source_offset = CHUNK_SIZE while source_offset + CHUNK_SIZE < file_size: upload_chunk(source_offset, source_offset + CHUNK_SIZE, {'Content-Location': content_location}) source_offset += CHUNK_SIZE # Upload last chunk of the file to complete the multipart upload upload_chunk(source_offset, file_size, {'Content-Location': content_location}) Copy HTTP Status: 202 HTTTP Headers: 'Content-Location': 'file-id:multipart-upload-id' --- # CLI | Akord docs [![Logo](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2Fgithub.com%2Ffluidicon.png&width=20&dpr=3&quality=100&sign=10439aae&sv=2)GitHub - Akord-com/akord-cli: A command-line interface to interact with AkordGitHubchevron-right](https://github.com/Akord-com/akord-cli) Last updated 2 years ago --- # Memos / messages | Akord docs Messages in Akord are called memos – a written message posted to the members of your private vault. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/memos-messages#write-a-new-memo-within-an-akord-vault) Write a new memo within an Akord vault Copy akord memo:create 'My first message!' Last updated 2 years ago --- # Login | Akord docs Akord wallet contain the keys and addresses that are used to interact with your vaults. A wallet is generated and associated with the user upon signup process. Configure the CLI by signing in with your Akord account. Copy akord login [email protected] Once authenticated, the CLI should return info about your imported Akord Wallet. Copy _ _ _ / \ | | __ ___ _ __ __| | / _ \ | |/ / / _ \ | '__| / _` | / ___ \ | < | (_) | | | | (_| | /_/ \_\ |_|\_\ \___/ |_| \__,_| Your wallet was stored successfully at: ~/.akord Your wallet address: Fam7cUuIO94BqEV3q1fEUuZX1VdFlU5sRphD4TeyWfQ= Your wallet public key: ZBL6aKJLQP0MBDMYvxSZe9xidQOb/fizZi5fjICvaAE= Your wallet signing public key: UpPO31iiWF7uLjU5KkekEU54SMgWuigAjrErORKAWb0= Don't have an account? Signup to Akord with an email address. Copy akord signup [email protected] Last updated 2 years ago --- # Memberships | Akord docs ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#invite-new-member-to-an-akord-vault) Invite new member to an Akord Vault Copy akord membership:invite ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#accept-an-invitation-to-an-akord-vault) Accept an invitation to an Akord Vault Copy akord membership:accept ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#reject-an-invitation-to-an-akord-vault) Reject an invitation to an Akord Vault Copy akord membership:reject ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#revoke-an-existing-membership) Revoke an existing membership While revoking a member, new vault key pair is generated by the owner and distributed to all active vault members. Copy akord membership:revoke Last updated 2 years ago * [Invite new member to an Akord Vault](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#invite-new-member-to-an-akord-vault) * [Accept an invitation to an Akord Vault](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#accept-an-invitation-to-an-akord-vault) * [Reject an invitation to an Akord Vault](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#reject-an-invitation-to-an-akord-vault) * [Revoke an existing membership](https://docs.akord.com/api-and-dev-tools/build/cli/memberships#revoke-an-existing-membership) --- # Vaults | Akord docs Akord offers secure vaults where one or more members can store encrypted data, with support for auditing, versioning and organization. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/vaults#create-a-new-vault) **Create a new vault** Using the CLI, you can create new vault: Copy akord vault:create 'Title of my Vault' The CLI will return your vault ID. Copy Vault successfully created with id: 8mECRKDn2mG1xabMEDgLYLtVDmr6pvrOMtAXdGQ4HxE Your transaction has been successfully commited. You can view it in the explorer by visiting the link below: https://sonar.warp.cc/#/app/interaction/DZ981kN4p-LXd7HqEUxUu-R-84SoLWiQGlk0Jb2VX4o ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/vaults#rename-an-existing-vault) Rename an existing vault Copy akord vault:rename 'New Title for my Vault' ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/vaults#archive-an-existing-vault) Archive an existing vault Copy akord vault:archive Last updated 2 years ago * [Create a new vault](https://docs.akord.com/api-and-dev-tools/build/cli/vaults#create-a-new-vault) * [Rename an existing vault](https://docs.akord.com/api-and-dev-tools/build/cli/vaults#rename-an-existing-vault) * [Archive an existing vault](https://docs.akord.com/api-and-dev-tools/build/cli/vaults#archive-an-existing-vault) --- # Simple uploads | Akord docs ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-1.1.-minimal-upload) **Example 1.1.** Minimal upload Bash JavaScript Python Copy curl --location 'https://api.akord.com/files' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: text/plain' \ --data '@/path/to/your/file.txt' Copy const fs = require('fs').promises; const data = await fs.readFile('/path/to/your/file.txt', 'utf8'); //nodejs specific const response = await fetch('https://api.akord.com/files', { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, body: data }) Copy import requests with open('/path/to/your/file.txt', 'r', encoding='utf-8') as file: data = file.read() response = requests.post( url='https://api.akord.com/files', headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, data=data ) Thats it! You just uploaded the file to Arweave. Here is the example response: Copy { "id": "a6f1fbfc-403d-4607-b648-4b949fdd50bd", //technical id of upload. can be used to get metadata of the upload or file binary from cloud storage "mime_type": "text/plain", //depends on content-type of upload, goes as a tag "sizeInBytes": 10, "cloud": { "uri": "a6f1fbfc-403d-4607-b648-4b949fdd50bd", //same as ID "url": "https://api.akord.com/files/a6f1fbfc-403d-4607-b648-4b949fdd50bd" //url to binary served from cloud storage }, "tx": { "id": "LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E", //fixed ID of Arweave transaction (ANS-104 data item ID) "status": "scheduled", //indicates where is your file in Arweave bundling context //scheduled - file is in our cloud storage and is scheduled for ANS-104 //verification - file is being verified for malicious content //blocked - file is recognized as malicious, won't go to Arweave //pending - file was bundled and posted to Arweave //confirmed - file is confirmed on Arweave //rejected - this indicates a technical problem with our bundling service) "tags": [], //your Arweave tags appended to transaction "statusUrl": "https://api.akord.com/files/a6f1fbfc-403d-4607-b648-4b949fdd50bd/status", //check file status endpoint, returns simillar JSON schema "gatewayUrls": [\ "https://akrd.net/LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E", \ //our instance of Arweave gateway - this url will work always, even right after upload since it falls back to cloud storage when file is not yet on Arweave\ "https://arweave.net/LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E" \ // other Arweave gatways\ ] "viewblockUrl": "https://viewblock.io/arweave/tx/LAWVdsBRTkUF8ptiEwiU6n4Q-_5ukBJIFmeAllX7Q0E", //see your file on Viewblock - this url will only work when file is in 'committed' status & indexed by Viewblock "info": "Transaction is visible on the blockchain indexers when in the \"committed\" status.", "infoUrl": "https://docs.akord.com/api-and-dev-tools/build/akord-api/files" } } ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-1.2.-upload-with-arweave-transaction-tags) **Example 1.2.** Upload with Arweave transaction tags To add tags to your Arweave transaction - use query params. Each query param with key prefixed with `tag-` is treated as Arweave transaction tags. Tags query params are case sensitive. E.g. `tag-file-category=photo` => Tag name: 'file-category', Tag value: 'photo' `Tag-File-Category=PHOTO` => Tag name: 'File-Category', Tag value: 'PHOTO' Bash Javascript Python ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-1.3.-upload-with-arweave-transaction-tags-encoded) **Example 1.3.** Upload with Arweave transaction tags (encoded) You may encode your tags as base64 string and pass it as a single param Bash Javascript Python ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-2.-upload-to-cloud-storage) **Example 2.** Upload to cloud storage Bash Javascript Python The request above stores the binary on ACS (Akord Cloud Storage) and does not trigger blockchain transaction. Cloud storage balance is consumed. Example response: Last updated 1 year ago * [Example 1.1. Minimal upload](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-1.1.-minimal-upload) * [Example 1.2. Upload with Arweave transaction tags](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-1.2.-upload-with-arweave-transaction-tags) * [Example 1.3. Upload with Arweave transaction tags (encoded)](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-1.3.-upload-with-arweave-transaction-tags-encoded) * [Example 2. Upload to cloud storage](https://docs.akord.com/api-and-dev-tools/build/rest-api/examples/simple-uploads#example-2.-upload-to-cloud-storage) Copy curl --location 'https://api.akord.com/files?tag-file-category=photo&tag-file-description=wedding%202024' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: image/png' \ --data '@/path/to/your/file.png' Copy const fs = require('fs').promises; const data = await fs.readFile('/path/to/your/file.txt', 'utf8'); //nodejs specific const response = await fetch('https://api.akord.com/files?tag-file-category=photo&tag-file-description=wedding%202024', { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, body: data }) Copy import requests with open('/path/to/your/file.txt', 'r', encoding='utf-8') as file: data = file.read() response = requests.post( url='https://api.akord.com/files?tag-file-category=photo&tag-file-description=wedding%202024', headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, data=data ) Copy { "id": "a2a48bc6-7e9f-48c6-abc7-9e641390680b", "mimeType": "image/png", "sizeInBytes": 437432, "cloud": { "uri": "a2a48bc6-7e9f-48c6-abc7-9e641390680b", "url": "https://api.akord.com/files/a2a48bc6-7e9f-48c6-abc7-9e641390680b" }, "tx": { "id": "ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo", "status": "scheduled", "tags": [\ {\ "name": "file-category",\ "value": "photo"\ },\ {\ "name": "file-description",\ "value": "wedding 2024"\ }\ ], "statusUrl": "https://api.akord.com/files/a2a48bc6-7e9f-48c6-abc7-9e641390680b/status", "gatewayUrls": [\ "https://akrd.net/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo",\ "https://arweave.net/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo"\ ], "viewblockUrl": "https://viewblock.io/arweave/tx/ewR2EcQJOSAN-dH0GZVswOG_g_kjtFh_dUSrjpbd_Lo", "info": "Transaction is visible on the blockchain indexers when in the \"committed\" status.", "infoUrl": "https://docs.akord.com/api-and-dev-tools/build/akord-api/files" } } Copy base64_encoded_tags=$(echo -n '[\ {\ "name": "file-category",\ "value": "photo"\ },\ {\ "name": "file-description",\ "value": "wedding 2024"\ }\ ]' | base64) # Use in querystring curl --location 'https://api.akord.com/files?tags=$base64_encoded_tags' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: image/png' \ --data '@/path/to/your/file.png' # Or use in header curl --location 'https://api.akord.com/files' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: image/png' \ --header 'Tags: $base64_encoded_tags' \ --data '@/path/to/your/file.png' Copy const fs = require('fs').promises; const tags = [\ {\ name: "file-category",\ value: "photo"\ },\ {\ name: "file-description",\ value: "wedding 2024"\ }\ ]; const jsonTags = JSON.stringify(tags); const base64EncodedTags = Buffer.from(jsonTags).toString('base64url'); const data = await fs.readFile('/path/to/your/file.txt', 'utf8'); //nodejs specific //Use in querystring const response = await fetch(`https://api.akord.com/files?tags=${base64EncodedTags}`, { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, body: data }) //Or use in header const response = await fetch(`https://api.akord.com/files`, { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' 'Tags': base64EncodedTags }, body: data }) Copy import json import base64 import requests tags = [\ {\ "name": "file-category",\ "value": "photo"\ },\ {\ "name": "file-description",\ "value": "wedding 2024"\ }\ ] json_tags = json.dumps(data).encode('utf-8') base64_encoded_tags = base64.urlsafe_b64encode(json_data).decode('utf-8') with open('/path/to/your/file.txt', 'r', encoding='utf-8') as file: data = file.read() #Use in querystring response = requests.post( url=f"https://api.akord.com/files?tags={base64_encoded_tags}", headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, data=data ) #Or use in header response = requests.post( url=f"https://api.akord.com/files", headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain', 'Tags': base64_encoded_tags }, data=data ) Copy curl --location 'https://api.akord.com/files?storage-class=cloud' \ --header 'Accept: application/json' \ --header 'Api-Key: your_api_key' \ --header 'Content-Type: image/png' \ --data '@/path/to/your/file.png' Copy const fs = require('fs').promises; const data = await fs.readFile('/path/to/your/file.txt', 'utf8'); //nodejs specific const response = await fetch('https://api.akord.com/files?storage-class=cloud', { method: 'POST', headers: { 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, body: data }) Copy import requests with open('/path/to/your/file.txt', 'r', encoding='utf-8') as file: data = file.read() response = requests.post( url='https://api.akord.com/files?storage-class=cloud', headers={ 'Accept': 'application/json', 'Api-Key': 'your_api_key', 'Content-Type': 'text/plain' }, data=data ) Copy { "id": "0976fac1-0d24-4a4e-b2bb-cd965840f656", "mimeType": "image/png", "sizeInBytes": 437432, "cloud": { "uri": "0976fac1-0d24-4a4e-b2bb-cd965840f656", "url": "https://api.akord.com/files/0976fac1-0d24-4a4e-b2bb-cd965840f656" } } --- # Folders | Akord docs ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/folders#create-new-folder) Create new folder Copy akord folder:create ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/folders#rename-an-existing-folder) Rename an existing folder Copy akord folder:rename 'New name' ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/folders#move-the-folder-to-a-different-folder-parent) Move the folder to a different folder (parent) Copy akord folder:move ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/folders#revoke-the-folder) Revoke the folder Revokes the given folder along with the sub-tree of stacks and folders. Copy akord folder:revoke ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/folders#restore-an-archived-folder) Restore an archived folder By restoring a folder, you make it active in the vault again. Restores the given folder along with the sub-tree of stacks and folders. Copy akord folder:restore ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/folders#delete-an-archived-folder) Delete an archived folder Forever removes the folder along with the sub-tree of stacks and folders from the vault. Last updated 2 years ago * [Create new folder](https://docs.akord.com/api-and-dev-tools/build/cli/folders#create-new-folder) * [Rename an existing folder](https://docs.akord.com/api-and-dev-tools/build/cli/folders#rename-an-existing-folder) * [Move the folder to a different folder (parent)](https://docs.akord.com/api-and-dev-tools/build/cli/folders#move-the-folder-to-a-different-folder-parent) * [Revoke the folder](https://docs.akord.com/api-and-dev-tools/build/cli/folders#revoke-the-folder) * [Restore an archived folder](https://docs.akord.com/api-and-dev-tools/build/cli/folders#restore-an-archived-folder) * [Delete an archived folder](https://docs.akord.com/api-and-dev-tools/build/cli/folders#delete-an-archived-folder) Copy akord folder:delete --- # Vault | Akord docs `**create(name, options)**` * `name` (`string`, required) - new vault name * `options` (`VaultCreateOptions`, optional) - public/private, terms of access, etc. * returns `Promise<{ vaultId, membershipId, transactionId }>` - Promise with new vault id, owner membership id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example) Copy // create a private vault const { vaultId, membershipId } = await akord.vault.create("my first private vault"); // create a public vault with terms of access const { vaultId, membershipId } = await akord.vault.create( "my first public vault", { public: true, termsOfAccess: "terms of access here - if the vault is intended for professional or legal use, you can add terms of access and they must be digitally signed before accessing the vault" } ); `**rename(vaultId, name)**` * `vaultId` (`string`, required) * `name` (`string`, required) - new vault name * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example-1) Copy const { transactionId } = await akord.vault.rename(vaultId, "updated name"); `**archive(vaultId)**` * `vaultId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example-2) `**restore(vaultId)**` * `vaultId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example-3) `**delete(vaultId)**` * `vaultId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example-4) `**get(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`VaultGetOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L14) , optional) * returns `Promise` - Promise with the vault object chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example-5) `**listAll(options)**` * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise>` - Promise with currently authenticated user vaults chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example-6) `**list(listOptions)**` * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise<{ items, nextToken }>` - Promise with paginated user vaults chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/vault#example-7) Last updated 2 years ago Copy const { transactionId } = await akord.vault.archive(vaultId); Copy const { transactionId } = await akord.vault.restore(vaultId); Copy const { transactionId } = await akord.vault.delete(vaultId); Copy const vault = await akord.vault.get(vaultId); Copy const vaults = await akord.vault.listAll(); Copy // retrieve first 100 user vaults const { items } = await akord.vault.list(); // retrieve first 20 user vaults const { items } = await akord.vault.list({ limit: 20 }); // iterate through all user vaults let token = null; let vaults = []; do { const { items, nextToken } = await akord.vault.list({ nextToken: token }); vaults = vaults.concat(items); token = nextToken; } while (token); --- # Files and stacks | Akord docs In an Akord vault, files and other assets are organized as 'stacks'. A stack represents one single file and all the subsequent revisions that may come after. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#upload-a-new-file) Upload a new File Copy akord stack:create --file-path "./photo.jpg" ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#rename-an-existing-stack) Rename an existing stack Stacks can be renamed. Each new name gets stored on top of the stack so that previous titles can be queried. Copy akord stack:rename "image.jpg" ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#upload-a-new-version-of-the-file) Upload a new version of the file You can upload multiple versions of files to the same stack. Similar to a stack of physical objects, each time you upload a new version, the stack height will increase. This gives a full audit trail of all the file's revisions and actions against it. Copy akord stack:upload-revision --file-path "./image-2.jpg" ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#move-the-stack-to-a-different-folder-parent) Move the stack to a different folder (parent) Stacks can be moved between folders or other objects (parents). This gives the members flexible control over how they can organize their stacks, either hierarchical or by group. Copy akord stack:move ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#revoke-the-stack) Revoke the stack You can remove the stack from your active vault. This doesn't remove the data from the vault, but rather changes the list of active stacks/files. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#restore-an-archived-stack) Restore an archived stack By restoring a stack, you make it active in the vault again. ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#delete-an-archived-stack) Delete an archived stack Forever removes the stack from the vault. Last updated 2 years ago * [Upload a new File](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#upload-a-new-file) * [Rename an existing stack](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#rename-an-existing-stack) * [Upload a new version of the file](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#upload-a-new-version-of-the-file) * [Move the stack to a different folder (parent)](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#move-the-stack-to-a-different-folder-parent) * [Revoke the stack](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#revoke-the-stack) * [Restore an archived stack](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#restore-an-archived-stack) * [Delete an archived stack](https://docs.akord.com/api-and-dev-tools/build/cli/files-and-stacks#delete-an-archived-stack) Copy akord stack:revoke Copy akord stack:restore Copy akord stack:delete --- # Add manifest | Akord docs You can add a manifest to your public vaults. Manifests enable you to access the contents of your public vaults with their file name and path on the permaweb. Manifests are useful for managing NFT collections: Go to the + menu inside a vault, and you will find the option to create a manifest. Last updated 2 years ago --- # Quick start | Akord docs This short section describes how to setup your environment for the Akord Command Line Interface (CLI). With the Akord CLI, you can interact with the protocol to create vaults, upload files, post messages and more. To get started, make sure you have Node version 16+ installed. Test your version of node and NPM from the command line. Copy node version npm version circle-info We recommend using **Node Version Manager (NVM)** to manage the installation and versioning of Node. [https://github.com/nvm-sh/nvm#installing-and-updatingarrow-up-right](https://github.com/nvm-sh/nvm#installing-and-updating) With node and NPM both installed, you can download and install the Akord CLI. Copy npm install -g @akord/akord-cli [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/quick-start#launch-your-first-akord-vault) Launch your first Akord vault ------------------------------------------------------------------------------------------------------------------------------------------ Now that you have the tools installed, let's launch a new vault on the permaweb. To proceed with the tutorial, please signup with an [Akord accountarrow-up-right](https://v2.akord.com/signup) . With your account ready, simply login via the command line: Copy akord login [email protected] The CLI should return your public keys. Copy _ _ _ / \ | | __ ___ _ __ __| | / _ \ | |/ / / _ \ | '__| / _` | / ___ \ | < | (_) | | | | (_| | /_/ \_\ |_|\_\ \___/ |_| \__,_| Your wallet was stored successfully at: ~/.akord Your wallet address: 9+zypjejQt17sd0dJ5MSfOLSy7kXOPsEGVetOVOUkRgZe0Zpy83Kubx/enrTwxf+djMevL0BlK0WsrR49FAyHg== Your wallet public key: vwRTJ8iMd0Dc+UyxEpueiIdCxiWXY9GZOJrBv1m6PXg= Your wallet signing public key: fHmAfeYh5yZ5q9bkr3D45Jcoia/DDsXNVXR4zJOUnIc= ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/quick-start#create-a-vault) Create a vault You're ready to create a vault. Make sure to note/save your vault id (see below). We'll use it for the next set of commands. Logging into the Akord app, you should be able to see your new vault. ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252F2h7rZMrotevnmxiOI0Mn%252Fhello-world-vault.png%3Falt%3Dmedia%26token%3Dd8348511-c713-44d9-acd2-a05232cd88b4&width=768&dpr=3&quality=100&sign=472354ff&sv=2) ### [hashtag](https://docs.akord.com/api-and-dev-tools/build/cli/quick-start#create-a-folder-and-upload-a-file) Create a folder and upload a file With our vault created, we're ready to create a folder with the vault ID we generated above: And finally, let's upload the file as a new stack: Last updated 2 years ago * [Launch your first Akord vault](https://docs.akord.com/api-and-dev-tools/build/cli/quick-start#launch-your-first-akord-vault) * [Create a vault](https://docs.akord.com/api-and-dev-tools/build/cli/quick-start#create-a-vault) * [Create a folder and upload a file](https://docs.akord.com/api-and-dev-tools/build/cli/quick-start#create-a-folder-and-upload-a-file) Copy akord vault:create "Hello World" Copy Vault successfully created with id: 8mECRKDn2mG1xabMEDgLYLtVDmr6pvrOMtAXdGQ4HxE Your transaction has been successfully commited. You can view it in the explorer by visiting the link below: https://sonar.warp.cc/#/app/interaction/DZ981kN4p-LXd7HqEUxUu-R-84SoLWiQGlk0Jb2VX4o Copy akord folder:create 8mECRKDn2mG1xabMEDgLYLtVDmr6pvrOMtAXdGQ4HxE "my first folder" Copy akord stack:create --file-path "./image.png" --parent-id --- # Akord Wallet | Akord docs The signup process to Akord is essentially the process to create your Akord wallet. The Akord wallet is a crypto wallet, which means it holds the keys that encrypt and decrypt your data. It's also used to authenticate you and sign all your transactions. After you enter your email and password during the signup process, you're provided with a 12-word recovery phrase. This is essentially the access control to your wallet. We do not store your password on our servers and we cannot reset your password if you forget it. circle-info Your recovery phrase is the only way to restore your account if you forget your password. The safest option for storing a recovery phrase is to store it offline, written down and stored in several safe places. This is the standard approach for people who use crypto wallets to manage large amounts of crypto currencies. Depending on the data you are storing on Akord, this may be a wise option. If your data has little monetary value you may be comfortable storing this phrase in a password manager. If you choose this option we still recommend keeping an offline copy of the recovery phrase just in case anything happens with your storage provider. At the very minimum, you should not be storing the recovery phrase online on an unencrypted service. Last updated 2 years ago --- # Sharing files | Akord docs [https://www.youtube.com/watch?feature=youtu.be&v=JQto0y5-WKIwww.youtube.comchevron-right](https://www.youtube.com/watch?feature=youtu.be&v=JQto0y5-WKI) You can share files in a number of ways. Sharing from Public vaults: * From the file menu, select 'Share' and the person you share the link with will land on that file from within the media gallery of the vault. * Go inside the media gallery and select the 'Share' button in the top right. Sharing files in Private vaults: * You must invite people to your vault to share the files as they are end-to-end encrypted. The 'Invite' option is found in the vault menu. ### [hashtag](https://docs.akord.com/app/product-guides/sharing-files#undefined) Last updated 2 years ago --- # Timeline | Akord docs Every vault has a timeline. It can allow you to easily audit and verify operations on-chain, fostering accountability and openness. Everything is included in the timeline. From the moment a vault is created, every action is recorded. * When files are uploaded, renamed, revoked and deleted. * When the vault was created and renamed. * All messages sent in chat. * When vault invites are sent and accepted. * When vault access is revoked. * * * [hashtag](https://docs.akord.com/app/product-guides/timeline#filtering-the-timeline) **Filtering the Timeline** -------------------------------------------------------------------------------------------------------------------- For easier navigation, you can also filter the timeline by action or by period. * Action _Accepted invites, created vault, deleted files, invites to vault, messages sent, renamed vault. revoked files, revoked invites, uploaded files._ * Period _Last 24 hours, last 48 hours, last 7 days, last 30 days_ Last updated 2 years ago --- # Messaging | Akord docs [https://www.youtube.com/watch?v=JShaXnqkpvIwww.youtube.comchevron-right](https://www.youtube.com/watch?v=JShaXnqkpvI) ### [hashtag](https://docs.akord.com/app/product-guides/messaging#sending-messages) Sending messages The chat tab displays your end-to-end encrypted messages, allowing you to chat with the members of your vault. All the messages sent within the vault will be saved on Arweave. To write a message, click in the message bar that runs along the bottom of the screen. * * * ### [hashtag](https://docs.akord.com/app/product-guides/messaging#emojis) Emojis You can add emojis in your messages using the icon to the left of the message bar at the bottom of the screen. You can also add emoji reactions. Hover over a chat bubble to see the add emoji icon. You can choose from 8 popular reactions. Last updated 2 years ago * [Sending messages](https://docs.akord.com/app/product-guides/messaging#sending-messages) * [Emojis](https://docs.akord.com/app/product-guides/messaging#emojis) --- # Auth | Akord docs Use `Auth` module to handle authentication. Copy import { Auth } from "@akord/akord-js"; * By default `Auth` is using SRP authentication * `Auth` stores tokens in `Storage` implementation * `Storage` defaults to localStorage on web & memoryStorage on nodeJs * `Storage` implementation can be configured with `Auth.configure({ storage: window.sessionStorage })` * `Auth` is automatically refreshing tokens in SRP mode * On server side it is recommended to use API keys: `Auth.configure({ apiKey: 'your_api_key' })` * API key: can be generated over web app & over CLI **Short-lived token with refresh** Copy import { Auth } from "@akord/akord-js"; Auth.configure({ storage: window.sessionStorage }); // optionally - configure tokens store **API key** Copy import { Auth } from "@akord/akord-js"; Auth.configure({ apiKey: "api_key" }); **Self-managed auth token** Copy import { Akord, Auth } from "@akord/akord-js"; Auth.configure({ authToken: "auth_token" }); `**signIn(email, password)**` * `email` (`string`, required) * `password` (`string`, required) * returns `Promise<{ wallet, jwt }>` - Promise with JWT token & Akord Wallet chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/auth#example) `**signUp(email, password)**` * `email` (`string`, required) * `password` (`string`, required) * `clientMetadata` (`any`, optional) - JSON client metadata, ex: { clientType: "CLI" } * returns `Promise` - Promise with Akord Wallet chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/auth#example-1) `**verifyAccount(email, code)**` * `email` (`string`, required) * `code` (`string`, required) * returns `Promise` chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/auth#example-2) Last updated 2 years ago Copy const { wallet } = await Auth.signIn("[email protected]", "1984"); Copy const { wallet } = await Auth.signUp("[email protected]", "1984"); Copy await Auth.verifyAccount("[email protected]", 123456); --- # Media gallery | Akord docs ### [hashtag](https://docs.akord.com/app/product-guides/media-gallery#supported-media) Supported media The media gallery in Akord supports the main file formats for images, video and audio, as well as displaying pdfs, Akord notes, markdown and JSON files. ### [hashtag](https://docs.akord.com/app/product-guides/media-gallery#launching-the-media-viewer) Launching the media viewer To start viewing your files, click on the file you want to see. ### [hashtag](https://docs.akord.com/app/product-guides/media-gallery#media-gallery-options) Media gallery options Within public vaults, you have the option to Share. You will be given a link which will take someone directly into this media viewer. #### [hashtag](https://docs.akord.com/app/product-guides/media-gallery#light-or-dark-mode) Light or dark mode You can select the theme color from light or dark mode by clicking on the sun/moon icon. This only applies while you're using the media viewer and will not affect your overall theme settings #### [hashtag](https://docs.akord.com/app/product-guides/media-gallery#view-transaction-only-in-blockchain-vaults) View transaction (only in blockchain vaults) To view metadata of your file, click on the "View transaction" icon. This will open the transaction page on [Viewblockarrow-up-right](https://viewblock.io/arweave/) . #### [hashtag](https://docs.akord.com/app/product-guides/media-gallery#print-and-download) Print & Download You can print or download any file displayed in the media viewer. #### [hashtag](https://docs.akord.com/app/product-guides/media-gallery#zoom-on-images-and-pdfs) Zoom on images and PDFs You can zoom in on pdfs and images simply by clicking on the file in the media viewer. Last updated 2 years ago * [Supported media](https://docs.akord.com/app/product-guides/media-gallery#supported-media) * [Launching the media viewer](https://docs.akord.com/app/product-guides/media-gallery#launching-the-media-viewer) * [Media gallery options](https://docs.akord.com/app/product-guides/media-gallery#media-gallery-options) --- # Product guides | Akord docs [Signing upchevron-right](https://docs.akord.com/app/product-guides/signing-up) [Akord Vaultschevron-right](https://docs.akord.com/app/product-guides/akord-vaults) [File managementchevron-right](https://docs.akord.com/app/product-guides/file-management) [Add manifestchevron-right](https://docs.akord.com/app/product-guides/add-manifest) [Sharing fileschevron-right](https://docs.akord.com/app/product-guides/sharing-files) [Media gallerychevron-right](https://docs.akord.com/app/product-guides/media-gallery) [Inviteschevron-right](https://docs.akord.com/app/product-guides/invites) [Messagingchevron-right](https://docs.akord.com/app/product-guides/messaging) [Noteschevron-right](https://docs.akord.com/app/product-guides/notes) [Timelinechevron-right](https://docs.akord.com/app/product-guides/timeline) [Storagechevron-right](https://docs.akord.com/app/product-guides/storage) [Accountchevron-right](https://docs.akord.com/app/product-guides/account) Last updated 1 year ago --- # Manifest | Akord docs Manifest is a special case of Stack that is unique per vault and follows the [Arweave Path Manifest standardarrow-up-right](https://github.com/ArweaveTeam/arweave/wiki/Path-Manifests) . `**generate(vaultId, manifest)**` If there is no manifest for the vault, a new manifest stack will be created, otherwise a new version of the manifest will be generated and uploaded. If no input JSON is provided by the user, the manifest will be generated automatically from the current vault state. * `vaultId` (`string`, required) * `manifest` (`JSON`, optional) - manifest JSON * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/manifest#example) Copy const { transactionId } = await akord.manifest.generate(vaultId); `**get(vaultId)**` * `vaultId` (`string`, required) * returns `Promise` - Promise with the vault manifest object chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/manifest#example-1) Copy const manifestNode = await akord.manifest.get(vaultId); `**getVersion(vaultId, index)**` Get vault manifest version by index, return the latest version by default * `vaultId` (`string`, required) * `index` (`number`, optional) - file version index * returns `Promise` - Promise with JSON manifest chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/manifest#example-2) Last updated 2 years ago Copy // get the latest vault manifest const manifest = await akord.manifest.getVersion(vaultId); // get the first version of the vault manifest const manifestV1 = await akord.manifest.getVersion(vaultId, 0); --- # Akord Vaults | Akord docs [https://youtu.be/k5isjt5odwU?si=isnYvKBUWHUNgpxfyoutu.bechevron-right](https://youtu.be/k5isjt5odwU?si=isnYvKBUWHUNgpxf) ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults#what-is-a-vault) What is a vault? The first time you login to Akord, you’ll be asked to create a vault. The vault is the place where all the action happens. When creating a vault you must decide if it’s to be Permanent or Cloud storage, and Private or Public. You have, therefore, 4 vault types: 1. Permanent and Private 2. Permanent and Public 3. Cloud and Private 4. Cloud and Public Last updated 2 years ago --- # Recovery phrase explained | Akord docs ### [hashtag](https://docs.akord.com/app/product-guides/signing-up/recovery-phrase-explained#introduction) Introduction With Akord, you own the keys that encrypt and decrypt your data. Your keys are generated when you sign up and are represented by your recovery phrase. For many web3 services, the recovery phrase is required any time you would like to access your wallet from a new device. Let's first explain what the recovery phrase is. In order to generate unique keys, we need a unique random number that is known as a “seed”. Since it is difficult for us to read a large number, crypto-wallets use a recovery phrase, which is a human-readable representation of the seed. It is also known by other names such as seed phrase, backup phrase, mnemonic, or passphrase. The recovery phrase is typically generated using an algorithm called [BIP39arrow-up-right](https://privacypros.io/wallets/mnemonic-phrase) and assigned to a user when signing up. Akord uses this method to generate the recovery phrase. It consists of 12 or 24 words that are chosen from a list of [2,048 wordsarrow-up-right](https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt) beginning with “abandon” and ending with “zoo”. How safe is a recovery phrase that is made up of 12 words? Well, since there are plenty of possible combinations, the chance of drawing the right combination is 1 out of the big number below: 2,048^12 = 5444517870735015415413993718908291383296 ≈ 5.4445179e+39 So, as you can see, recovery phrase is pretty much impossible to hack from a brute force attack that tries to guess what your recovery phrase is. You just need to store it in a safe place. We recommend the following security practices: * Store your recovery phrase in a few different secure locations offline. * Don’t communicate your recovery phrase to anyone. * Don’t store your recovery phrase unencrypted digitally. ### [hashtag](https://docs.akord.com/app/product-guides/signing-up/recovery-phrase-explained#you-own-the-recovery-phrase-on-akord) You own the recovery phrase on Akord In Akord, we ask for an email address and password. We ask for your email so we can send you important notifications when other people in your vault take actions. Your password is used to decrypt your recovery phrase locally when you want to sign in. The recovery phrase is encrypted using your actual password. This means that nobody can decrypt your recovery phrase without knowing your password. We store the following three things in our database: 1. E-mail address 2. Encrypted recovery phrase 3. Verifier of the password We do not store your password, but rather a cryptographic verifier of it. This means that we can easily check if a password you entered is correct without ever seeing the password itself. For those who are curious about how this works in detail, you can read about this process in the [Secure Remote Password protocolarrow-up-right](https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol) (SRP). So here’s the process when you sign up with your email address and password. First, we encrypt your recovery phrase with the password you entered, or more precisely, with a key derived from your password using [PBKDF2arrow-up-right](https://en.wikipedia.org/wiki/PBKDF2) . Then, we use the SRP protocol, to compute a cryptographic verifier: We send these two pieces of information along with your email address to our server. This makes it impossible for any middleman, or for anyone with access to the data, including Akord, to decrypt your recovery phrase or obtain any information about your password. ### [hashtag](https://docs.akord.com/app/product-guides/signing-up/recovery-phrase-explained#akords-simple-sign-in) Akord’s simple sign in Most web3 services require you to connect with a wallet, but with Akord you just need your email and password. When you sign in, we first look up your email address and use the SRP protocol to make sure that the password you provided is correct, again, without actually sending the password. If the provided email and password are correct, we send back the encrypted recovery phrase. It is decrypted directly in your browser, meaning that nobody but you ever knows it. At this point, you're ready to use our user-friendly UI to upload your files to Arweave, with all encryption and decryption happening directly in your browser. Last updated 2 years ago * [Introduction](https://docs.akord.com/app/product-guides/signing-up/recovery-phrase-explained#introduction) * [You own the recovery phrase on Akord](https://docs.akord.com/app/product-guides/signing-up/recovery-phrase-explained#you-own-the-recovery-phrase-on-akord) * [Akord’s simple sign in](https://docs.akord.com/app/product-guides/signing-up/recovery-phrase-explained#akords-simple-sign-in) --- # Invites | Akord docs [hashtag](https://docs.akord.com/app/product-guides/invites#sending-invites) Sending invites ------------------------------------------------------------------------------------------------- After you create your vault, one of the first things you may want to do is invite other people. You can find the option to invite from two views: the menu accessible on the list of vaults or within a specific vault itself. Within the invite screen you can enter the email address of the person you want to invite, and then set the permissions you want to give them. You can also invite several people at the same time. * * * [hashtag](https://docs.akord.com/app/product-guides/invites#roles) Roles ----------------------------------------------------------------------------- ### [hashtag](https://docs.akord.com/app/product-guides/invites#owner) Owner If you invite someone as an Owner, they have equal rights to manage the vault and its members. Owners have access to vault-leve features such as inviting and revoking people, renaming the vault, archiving and disabling the vault. Owners have access to core features such as posting encrypted messages, uploading files, adding new file versions, renaming files, revoking files. triangle-exclamation Owner access cannot be revoked. They can only give up their acess by leaving the vault. ### [hashtag](https://docs.akord.com/app/product-guides/invites#contributor) Contributor If you invite someone as a Contributor they have all the core features need to contribute and collaborate: post encrypted messages, upload files, add new file versions, file rename, revoke files and request data. The features not available to Contributors are vault-level features that are only available to you as the vault owner, such as inviting people, renaming, archiving and disabling the vault. ### [hashtag](https://docs.akord.com/app/product-guides/invites#view-only) View only If you invite someone with View only permissions, then they can only view the Activity and Assets in the vault. They can also download files, as some files may not be able to viewed within the vault if their file type is not supported by the file viewer. You can write a message that will be sent along with your invitation. This message is not encrypted, as we send it inside an email notification, so do not include any sensitive information within this message. * * * [hashtag](https://docs.akord.com/app/product-guides/invites#accepting-or-rejecting-an-invite) Accepting or rejecting an invite ----------------------------------------------------------------------------------------------------------------------------------- Anyone you invite will be sent an email with any message you sent and a link to view the vault. After clicking the link and entering their Akord login details (if they're not already signed in) , they will be able to access your vault. * * * [hashtag](https://docs.akord.com/app/product-guides/invites#managing-access) Managing access ------------------------------------------------------------------------------------------------- After you invite someone there are a number of situations where you may need to manage their access to the vault. You may need to resend their invite if they can’t find the original invite. You may want to change their permissions or remove them altogether from your vault. All of these actions can be done from within the Manage Access screen, which is located in the vault menu. Last updated 2 years ago * [Sending invites](https://docs.akord.com/app/product-guides/invites#sending-invites) * [Roles](https://docs.akord.com/app/product-guides/invites#roles) * [Owner](https://docs.akord.com/app/product-guides/invites#owner) * [Contributor](https://docs.akord.com/app/product-guides/invites#contributor) * [View only](https://docs.akord.com/app/product-guides/invites#view-only) * [Accepting or rejecting an invite](https://docs.akord.com/app/product-guides/invites#accepting-or-rejecting-an-invite) * [Managing access](https://docs.akord.com/app/product-guides/invites#managing-access) --- # Creating a vault | Akord docs ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/creating-a-vault#step-1.-choose-the-type-of-storage-for-your-vault) Step 1. Choose the type of storage for your vault. ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FrwZeIJRi904c7PtFfGAN%252FScreenshot%25202024-01-19%2520at%25205.37.14%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3De308aef8-274a-41ea-8498-82d72b79bd0e&width=768&dpr=3&quality=100&sign=1d076012&sv=2) * * * ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/creating-a-vault#step-2.-choose-the-privacy-setting-for-your-vault) Step 2. Choose the privacy setting for your vault. ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FCKzGwrV2YnK0TrOLlwYu%252FScreenshot%25202024-01-19%2520at%25205.37.56%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3D0dcf1b6d-09ee-47dd-a633-43ea8b203c54&width=768&dpr=3&quality=100&sign=98b7f170&sv=2) * * * ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/creating-a-vault#step-3.-add-your-vault-title-description-and-tags) Step 3. Add your vault title, description and tags ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FmDzaDII8boz2PaUmqE0a%252FScreenshot%25202024-01-19%2520at%25205.38.34%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3Dd188e4d7-a99b-45f6-a058-d0c5b94e51a5&width=768&dpr=3&quality=100&sign=7f71a8f2&sv=2) Description and tags are particularly useful for public vaults that can be discovered by anyone. Tags are used in Akord Explorer's search feature, enabling other users to discover your vault. The description appears inside a vault on Explorer and can inform people about what's inside your vault, as well as maybe encouraging them to follow your vault. Last updated 2 years ago * [Step 1. Choose the type of storage for your vault.](https://docs.akord.com/app/product-guides/akord-vaults/creating-a-vault#step-1.-choose-the-type-of-storage-for-your-vault) * [Step 2. Choose the privacy setting for your vault.](https://docs.akord.com/app/product-guides/akord-vaults/creating-a-vault#step-2.-choose-the-privacy-setting-for-your-vault) * [Step 3. Add your vault title, description and tags](https://docs.akord.com/app/product-guides/akord-vaults/creating-a-vault#step-3.-add-your-vault-title-description-and-tags) --- # File management | Akord docs [Uploading fileschevron-right](https://docs.akord.com/app/product-guides/file-management/uploading-files) [Sort/filter, folders & batch actionschevron-right](https://docs.akord.com/app/product-guides/file-management/sort-filter-folders-and-batch-actions) [File versioningchevron-right](https://docs.akord.com/app/product-guides/file-management/file-versioning) [Add manifestchevron-right](https://docs.akord.com/app/product-guides/add-manifest) [File infochevron-right](https://docs.akord.com/app/product-guides/file-management/file-info) Last updated 2 years ago --- # Batch | Akord docs `**revoke(items)**` * `items` (`Array<{ id: string, type:`[`NodeType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/node.ts#L11) `}>`, required) * returns `Promise>` - Promise with corresponding transaction ids `**restore(items)**` * `items` (`Array<{ id: string, type:`[`NodeType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/node.ts#L11) `}>`, required) * returns `Promise>` - Promise with corresponding transaction ids `**delete(items)**` * `items` (`Array<{ id: string, type:`[`NodeType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/node.ts#L11) `}>`, required) * returns `Promise>` - Promise with corresponding transaction ids `**move(items, parentId)**` * `items` (`Array<{ id: string, type:`[`NodeType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/node.ts#L11) `}>`, required) * `parentId` (`string`, optional) * returns `Promise>` - Promise with corresponding transaction ids `**membershipChangeRole(items)**` * `items` (`Array<{ id: string, role:`[`RoleType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/membership.ts#L4) `}>`, required) * returns `Promise>` - Promise with corresponding transaction ids `**stackCreate(vaultId, items)**` * `vaultId` (`string`, required) * `items` (`Array<{ file:`[`FileLike`arrow-up-right](https://github.com/Akord-com/akord-js/blob/ab9bb814fa9cf73d9ed01052738c8b84a86040b2/src/types/file.ts#L8) `, name: string }>`, required) * `options` (`BatchStackCreateOptions`, optional) * returns `Promise<`[`BatchStackCreateResponse`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/batch-response.ts#L1) `>` - Promise with new stack ids & their corresponding transaction ids `**membershipInvite(vaultId, items)**` * `vaultId` (`string`, required) * `items` (`Array<{ email: string, role:`[`RoleType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/membership.ts#L4) `}>`, required) * `options` (`MembershipCreateOptions`, optional) - invitation email message, etc. * returns `Promise<`[`BatchMembershipInviteResponse`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/batch-response.ts#L7) `>` - Promise with new membership ids & their corresponding transaction ids Last updated 2 years ago --- # File versioning | Akord docs In Akord we have an in-built system for file versioning. Once you upload a file to Akord, you have the option to add a new version. Your new files take their name from the current name of the file you're adding to. That’s to say, if you upload a file called _Alice_ and the first file you had uploaded is called _Bob_, then the new file will be called _Bob._ When you’re within the media viewer, you have the option to view all the previous versions of a file. All the versions will take the name of the file you're adding to, but they will also be marked with a suffix, V1/2/3 etc, and this will be added to any of the versions you download. ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FqQUzENLcgj8DTmEu9aTL%252FScreenshot%25202024-01-22%2520at%252011.15.43%25E2%2580%25AFPM.png%3Falt%3Dmedia%26token%3Db861c46d-826b-4356-bf5a-3c10f5bf91d0&width=768&dpr=3&quality=100&sign=51ae0846&sv=2) Last updated 2 years ago --- # Sort/filter, folders & batch actions | Akord docs ### [hashtag](https://docs.akord.com/app/product-guides/file-management/sort-filter-folders-and-batch-actions#sorting-and-filtering-your-files) Sorting and filtering your files Within the Files view of your vault you will see a list of every file uploaded. From this view you can more easily focus and manage your assets. This view looks similar to any cloud storage provider with all your files listed in a tabular format. You can sort each column by clicking the title – Name, Modified on, Size, Versions – and sort results in ascending/descending or A-z/Z-a order. You can also filter the file view from the icon in the top right. You can filter to show certain file types, a time period of when the files were uploaded, or a combination of both. ### [hashtag](https://docs.akord.com/app/product-guides/file-management/sort-filter-folders-and-batch-actions#folders) Folders Create a hierarchy and structure in your vault by creating folders. Select 'Create a folder' from the + button in the top right of the vault UI: ### [hashtag](https://docs.akord.com/app/product-guides/file-management/sort-filter-folders-and-batch-actions#batch-actions) Batch actions You can perform the following batch actions on your files: * Download * Move * Revoke Selecting all files and executing the batch actions is done through the bar of icons above your list of files: Or select single files by clicking on their icon: You can also select a group of files by holding down the shift key and selecting the first and last file in the group. Last updated 2 years ago * [Sorting and filtering your files](https://docs.akord.com/app/product-guides/file-management/sort-filter-folders-and-batch-actions#sorting-and-filtering-your-files) * [Folders](https://docs.akord.com/app/product-guides/file-management/sort-filter-folders-and-batch-actions#folders) * [Batch actions](https://docs.akord.com/app/product-guides/file-management/sort-filter-folders-and-batch-actions#batch-actions) --- # Vault info | Akord docs ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/vault-info#vault-info-for-blockchain-vaults) Vault info for blockchain vaults ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FDXsurXCrDlbXBypTiwAW%252FScreenshot%25202024-01-19%2520at%25205.26.26%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3Df2ebd408-1e8a-477c-ac24-e70d67e1f2e2&width=768&dpr=3&quality=100&sign=7689aa95&sv=2) From the vault menu in the top right, select the "Vault info" option From the vault menu in the top right, select the "Vault info" option and you will see a slide out tray that holds useful information on your vault: * Vault ID _Warp contract identifier - useful for querying transaction log and vault assets_ * Copy Vault URI _This is needed if you're trying to sync Akord vaults, or sync a vault with an S3 bucket._ * View contract link _takes you to the vault contract page on_ [_https://sonar.warp.cc/_arrow-up-right](https://sonar.warp.cc/) * View transaction history link _takes you to the vault's transaction history on_ [_https://viewblock.io/arweave_arrow-up-right](https://viewblock.io/arweave) * Created at date * Status * Size * * * ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/vault-info#vault-info-for-cloud-vaults) Vault info for cloud vaults * Created at date * Status * Size Last updated 2 years ago * [Vault info for blockchain vaults](https://docs.akord.com/app/product-guides/akord-vaults/vault-info#vault-info-for-blockchain-vaults) * [Vault info for cloud vaults](https://docs.akord.com/app/product-guides/akord-vaults/vault-info#vault-info-for-cloud-vaults) --- # Storage | Akord docs [Monitoring usagechevron-right](https://docs.akord.com/app/product-guides/storage/monitoring-usage) [Top upschevron-right](https://docs.akord.com/app/product-guides/storage/top-ups) [Blockchain transactionschevron-right](https://docs.akord.com/app/product-guides/storage/blockchain-transactions) Last updated 2 years ago --- # Signing up | Akord docs [https://youtu.be/ILIQv4HBdksyoutu.bechevron-right](https://youtu.be/ILIQv4HBdks) ### [hashtag](https://docs.akord.com/app/product-guides/signing-up#step-1.-email-and-password) Step 1. Email and password Like web2 services, we ask for an email and password. But we use them in different ways. We use the email address to communicate with you when important things happen in Akord. Additionally, your password serves as a shortcut for accessing your Akord wallet and decrypting your encryption keys on your device. ⚠️ **We do not store your password on our servers and we cannot reset your password if you forget it.** * * * ### [hashtag](https://docs.akord.com/app/product-guides/signing-up#step-2.-terms-and-conditions) Step 2. Terms and Conditions After inputting your email and password, you have to agree to our [terms of servicearrow-up-right](https://akord.com/terms-of-service-consumer) and [privacy policyarrow-up-right](https://akord.com/privacy-policy) . Additionally, you also have to give up your withdrawal right. chevron-right**What is the withdrawal right**?[hashtag](https://docs.akord.com/app/product-guides/signing-up#what-is-the-withdrawal-right) In many countries, the consumer must be informed of their right of withdrawal, and of the ways to exercise this right. It means you have a right to exit a service if you wish, and this is typically 14 days from agreeing to use the service. However, your right of withdrawal may be waived or not exist if the service is delivered before the end of the withdrawal period. chevron-rightWhy we ask you to waive this right[hashtag](https://docs.akord.com/app/product-guides/signing-up#why-we-ask-you-to-waive-this-right) In Akord's case, the action of creating vaults and uploading data to the Arweave blockchain before this 14-day period would make any withdrawal action impossible – the data is already permanently stored on the blockchain, and any reversal of this action is impossible. If you have any questions on this issue of other legal questions, please contact: [\[email protected\]envelope](https://docs.akord.com/cdn-cgi/l/email-protection#770312051a0437161c1805135914181a) * * * ### [hashtag](https://docs.akord.com/app/product-guides/signing-up#step-3.-store-your-recovery-phrase) Step 3. Store your recovery phrase ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FJjhbsDVGTOckR3PHKqHC%252FScreenshot%25202024-01-19%2520at%25204.47.48%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3D5fe4ce77-3865-4a92-9bac-f588bd20cdc1&width=768&dpr=3&quality=100&sign=914f8816&sv=2) Next, you're given a 12-word recovery phrase. This is extremely important. If you lose your password, you'll need this recovery phrase to recover access to your account. Make sure you store this using security best practices. After doing so, proceed to the next step by clicking _Setup account_. * * * ### [hashtag](https://docs.akord.com/app/product-guides/signing-up#step-4.-verify-your-email) Step 4. Verify your email ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FZi3hBwzte78qSqKgQTyG%252FScreenshot%25202024-01-19%2520at%25204.54.31%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3D4cbe4f3d-ebd7-4c74-aea7-4340f362808a&width=768&dpr=3&quality=100&sign=5307c2c9&sv=2) After you click 'Setup account', you must verify your email address. We send you a link to the email address you entered in Step 1. Click the link in the email and that's it, your account is verified. circle-info Incase you have not received an email, you can click _resend email_ to receive another verification link ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FFOcm0nOGHxFBcHPwDGB2%252FScreenshot%25202024-01-19%2520at%25204.55.34%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3Dd8a45596-6909-4d03-a8f3-a1b38bc6623a&width=768&dpr=3&quality=100&sign=5258c2db&sv=2) * * * ### [hashtag](https://docs.akord.com/app/product-guides/signing-up#step-5.-make-your-first-upload-to-arweave) Step 5. Make your first upload to Arweave Now that your account is set up, you can make your first upload. [Uploading fileschevron-right](https://docs.akord.com/app/product-guides/file-management/uploading-files) Last updated 2 years ago * [Step 1. Email and password](https://docs.akord.com/app/product-guides/signing-up#step-1.-email-and-password) * [Step 2. Terms and Conditions](https://docs.akord.com/app/product-guides/signing-up#step-2.-terms-and-conditions) * [Step 3. Store your recovery phrase](https://docs.akord.com/app/product-guides/signing-up#step-3.-store-your-recovery-phrase) * [Step 4. Verify your email](https://docs.akord.com/app/product-guides/signing-up#step-4.-verify-your-email) * [Step 5. Make your first upload to Arweave](https://docs.akord.com/app/product-guides/signing-up#step-5.-make-your-first-upload-to-arweave) --- # File info | Akord docs [https://youtu.be/TXQ29qF7VW0?si=E0M-sOEHEVyBj0Viyoutu.bechevron-right](https://youtu.be/TXQ29qF7VW0?si=E0M-sOEHEVyBj0Vi) ### [hashtag](https://docs.akord.com/app/product-guides/file-management/file-info#file-info-for-blockchain-vaults) File info for blockchain vaults From the file menu, select the "File info" option. In public permanent vaults there is an info icon on each file row for quicker access. Selecting this option will show a slide out tray that holds useful information on your file: * arweave.net link _This link will access the file from the Arweave network on arweave.net – it is the gateway managed by the ar.io team._ * View transaction link (takes you to the transaction page on Arweave blockchain explorer, [viewblock.ioarrow-up-right](https://viewblock.io/) ) * First uploaded date * Last modified date * Version * Status * Size * File type * * * ### [hashtag](https://docs.akord.com/app/product-guides/file-management/file-info#file-info-for-cloud-vaults) File info for cloud vaults From the file menu, select the "File info" option and you will see a slide out tray that holds useful information on your file: * First uploaded date * Last modified date _Will be the same as first uploaded date until a new version is added._ * Version _Shows the total number of iterations of a specific file_ * Status * Size * File type Last updated 2 years ago * [File info for blockchain vaults](https://docs.akord.com/app/product-guides/file-management/file-info#file-info-for-blockchain-vaults) * [File info for cloud vaults](https://docs.akord.com/app/product-guides/file-management/file-info#file-info-for-cloud-vaults) --- # Top ups | Akord docs From within the storage screen, you can add more storage by clicking the "Top up" button in the top right. Select the amount of storage you want to add to your account, and either pay with Apple or Google pay, or fill out the payment details to pay via credit card. Akord pays for the storage on the Arweave blockchain, which is paid in the $AR token, behind the scenes. As this cost varies, we may need to adjust our pricing depending on whether this cost increases over time. Always check the price carefully on the top up page. Consider upgrading your subscription to purchase permanent storage at a discounted price. Last updated 2 years ago --- # Reveal recovery phrase | Akord docs Your recovery phrase is 12 randomly generated words created to backup your account. Keeping your recovery phrase safe is critically important. We recommend you: * Store your recovery phrase in a few different secure locations offline. * Don’t communicate your phrase to anyone. * Don’t store your recovery phrase unencrypted digitally. If you lose your recovery phrase and forget your password, then you will not be able to access your account. In order to truly own your data you need to own the keys to its encryption. You can reveal your backup phrase by going _Account_ > _Security_ > _Reveal backup phrase_. Last updated 2 years ago --- # Vault types explained | Akord docs ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-1.-permanent-storage) 1\. Permanent storage **With permanent storage all your files, messages and metadata are stored on the** [**Arweave**arrow-up-right](https://akord.com/learn/what-is-arweave) **blockchain.** **Arweave is a permanent data storage network**. The only truly permanent data storage solution in existence. Files cannot be deleted and [data is stored for at least 200 yearsarrow-up-right](https://akord.com/learn/how-can-we-store-data-for-200-years) . **Permanent storage is decentralised**, storing data in hundreds of nodes across the globe, and eliminating many single-point-of-failure risks. The Arweave network is programmed to incentivise storage providers and doesn’t require a centralised entity to maintain its service. **Once your file is stored you never have to pay again for the storage of that file.** It’s more expensive than the cloud initially, but for storing data over the long term it is the more cost effective choice. **Permanence makes data more real and adds value.** Because data is stored forever, it is no longer ephemeral and can give it much more value. It’s why permanent storage on Arweave is a very popular choice for NFTs, and a logical choice for archiving and preservation projects. **Permanent storage can only be used once**. For example, if you buy 1 GB of permanent storage and upload a 1 GB video, then that 1 GB is gone. You can’t delete the video, so you can’t get that 1 GB back. **Permanent storage is ideal for files you never want to lose access to**, and is most powerful when you want to store this data for as long as possible or many generations. **If you stop paying a subscription to Akord your permanent storage remains accessible forever**. **Your Akord account will never be deactivated** for lack of activity. [**Akord Explorer**arrow-up-right](https://akord.com/platform/explorer) **guarantees perpetual accessibility even if Akord were to cease operations**. Explorer is a decentralized app running directly on Arweave and will live alongside your data on the blockchain. All you need is your recovery phrase to connect and all your vaults will be there. **Permanent storage is not a good choice if you believe you may need to delete the data** at a given point in the future. In the business context, personally identifiable information from customers falls under data regulations like CCPA and GDPR, and is therefore unlikely to be suitable if the customer doesn’t control the vault. * * * ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-2.-cloud-storage) 2\. Cloud storage **Your data will be stored on** [**AWS**arrow-up-right](https://aws.amazon.com/) with data held in Frankfurt, Germany, if you choose cloud storage. **Cloud storage is much cheaper and more flexible when managing data**, compared to permanent storage. For example, it costs relatively little to have hundreds of GB of cloud storage, upload large amounts of data, decide the next month it’s no longer needed, delete it and recover that storage space. **Once you stop paying your monthly payments you’re at risk of having your data deleted.** On Akord, if you stop paying a subscription, then we’ll give you at least a month to get your files on cloud storage downloaded and migrated if needed. But eventually that data will have to be deleted. **Cloud storage depends on a centralised service**. There’s no guarantee that AWS will continue running storage services in years to come, or even exist. **Cloud storage makes sense if you have large amounts of data that is not critical**, and you may want to delete it at some point. **Cloud storage is not a good choice for the data we absolutely can’t afford to lose.** **The cloud has a number of security risks.** Data in the cloud, as it’s held by a centralised service, is prone to single-point-of-failure risks and cyber attacks such as ransomware. **Akord’s end-to-end encryption mitigates some of these security flaws** inherent in the cloud, giving you a greater degree of control and ownership over cloud data. * * * ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-3.-private-vaults) 3\. Private vaults **Private vaults on Akord are protected by end-to-end encryption**. **All files and messages are encrypted on your device** before ever being sent to Akord or Arweave. **Cloud services like Dropbox and Google Drive do not end-to-end encrypt your data**, making it vulnerable to hacks and leaks. **You own the keys to the encryption**, meaning there can be no backdoors to your data. **Your data’s so secure even we can’t see it**. **You can invite other people into your private vaults,** giving them access control permissions. Members of your vault can be either Owners (with equal permissions), Contributors (able to upload and message etc) or View Only. **You can chat with end-to-end encryption in private vaults**, as well as access other collaborative features enabling you to manage whole workflows in a secure context. * * * ### [hashtag](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-4.-public-vaults) 4\. Public vaults **Files and messages in public vaults are not encrypted.** **Do not upload anything to a public vault that you are not comfortable sharing with the world.** **Public vaults using permanent storage can be:** * **Ideal for ensuring files stay in the public domain forever.** The immutable and permanent nature of Arweave guarantees that data in your public vaults will be accessible to anyone in the world with internet access. * **Used for radical transparency.** We can use the immutable nature of this on-chain storage to make a public statement. Because data on the cloud can be easily overwritten, edited or deleted, we can never be certain of its integrity. * **Discovered and followed on Akord Explorer**. Explorer is our decentralized app running directly on the Arweave blockchain, and it enables anyone to search for public vaults through their title or tags added to the vault. People can then follow the vaults they like. Last updated 2 years ago * [1\. Permanent storage](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-1.-permanent-storage) * [2\. Cloud storage](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-2.-cloud-storage) * [3\. Private vaults](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-3.-private-vaults) * [4\. Public vaults](https://docs.akord.com/app/product-guides/akord-vaults/vault-types-explained#id-4.-public-vaults) --- # Folder | Akord docs `**create(vaultId, name, parentId)**` * `vaultId` (`string`, required) * `name` (`string`, required) - folder name * `options` (`NodeCreateOptions`, optional) - parent id, etc. * returns `Promise<{ folderId, transactionId }>` - Promise with new folder id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example) Copy const { folderId } = await akord.folder.create(vaultId, "my first folder"); `**rename(folderId, name)**` * `folderId` (`string`, required) * `name` (`string`, required) - new folder name * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-1) Copy const { transactionId } = await akord.folder.rename(folderId, "my first folder"); `**move(folderId, parentId)**` Move the given folder along with its content to a different folder (parent): * `folderId` (`string`, required) * `parentId` (`string`, required) - new parent folder id * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-2) `**revoke(folderId)**` Revoke the given folder along with the sub-tree of stacks and folders: * `folderId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-3) `**restore(folderId)**` Restore the given folder along with the sub-tree of stacks and folders: * `folderId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-4) `**delete(folderId)**` Remove the folder along with the sub-tree of stacks and folders from the vault: * `folderId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-5) `**get(folderId, options)**` * `folderId` (`string`, required) * `options` ([`GetOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L9) , optional) * returns `Promise` - Promise with the folder object chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-6) `**listAll(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise>` - Promise with all folders within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-7) `**list(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise<{ items, nextToken }>` - Promise with paginated folders within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/folder#example-8) Last updated 2 years ago Copy // create root folder const rootFolderId = (await akord.folder.create(vaultId, "root folder")).folderId; // move the folder to newly created root folder const { transactionId } = await akord.folder.move(folderId, rootFolderId); Copy const { transactionId } = await akord.folder.revoke(folderId); Copy const { transactionId } = await akord.folder.restore(folderId); Copy const { transactionId } = await akord.folder.delete(folderId); Copy const folder = await akord.folder.get(folderId); Copy const folders = await akord.folder.listAll(vaultId); Copy // retrieve first 100 folders for the vault const { items } = await akord.folder.list(vaultId); // retrieve first 20 folders for the vault const { items } = await akord.folder.list(vaultId, { limit: 20 }); // iterate through all folders let token = null; let folders = []; do { const { items, nextToken } = await akord.folder.list(vaultId, { nextToken: token }); folders = folders.concat(items); token = nextToken; } while (token); --- # Memo (message) | Akord docs `**create(vaultId, message)**` * `vaultId` (`string`, required) * `message` (`string`, required) - memo content * `options` (`NodeCreateOptions`, optional) - parent id, etc. * returns `Promise<{ memoId, transactionId }>` - Promise with new memo id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/memo-message#example) Copy const { memoId } = await akord.memo.create(vaultId, "Suspendisse ut lorem vitae lectus faucibus lacinia"); `**addReaction(memoId, reaction)**` * `memoId` (`string`, required) * `reaction` (`reactionEmoji`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/memo-message#example-1) Copy import { Akord } from "@akord/akord-js" // valid values: [JOY, ASTONISHED, CRY, HEART, FIRE, THUMBS_UP, THUMBS_DOWN, PRAY] const { transactionId } = await akord.memo.addReaction(memoId, Akord.reactionEmoji.FIRE); `**removeReaction(memoId, reaction)**` * `memoId` (`string`, required) * `reaction` (`reactionEmoji`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/memo-message#example-2) `**get(memoId, options)**` * `memoId` (`string`, required) * `options` ([`GetOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L9) , optional) * returns `Promise` - Promise with the memo object chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/memo-message#example-3) `**listAll(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise>` - Promise with all memos within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/memo-message#example-4) `**list(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise<{ items, nextToken }>` - Promise with paginated memos within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/memo-message#example-5) Last updated 2 years ago Copy import { Akord } from "@akord/akord-js" // valid values: [JOY, ASTONISHED, CRY, HEART, FIRE, THUMBS_UP, THUMBS_DOWN, PRAY] const { transactionId } = await akord.memo.removeReaction(memoId, Akord.reactionEmoji.FIRE); Copy const memo = await akord.memo.get(memoId); Copy const memos = await akord.memo.listAll(vaultId); Copy // retrieve first 100 memos for the vault const { items } = await akord.memo.list(vaultId); // retrieve first 20 memos for the vault const { items } = await akord.memo.list(vaultId, { limit: 20 }); // iterate through all memos let token = null; let memos = []; do { const { items, nextToken } = await akord.memo.list(vaultId, { nextToken: token }); memos = memos.concat(items); token = nextToken; } while (token); --- # Notes | Akord docs ### [hashtag](https://docs.akord.com/app/product-guides/notes#getting-started) Getting started Notes allow you to create documents directly within your vault. To start creating a note, open your vault first, then click on the + button in the top right corner, and click on "Create a note". * * * ### [hashtag](https://docs.akord.com/app/product-guides/notes#formatting-text-styles) Formatting text styles To format text, first select the text you would like to change. Then, select the style you like from the options displayed. * * * ### [hashtag](https://docs.akord.com/app/product-guides/notes#using-markdown) Using markdown Notes support a subset of the markdown language when writing up a note. Here is a table of supported markdown features: Feature Markdown format Titles and subtitles Prefix with `#` `##`, `###`, etc Unordered list Prefix with `*` or `-` Ordered list Prefix with `1.` Bold font Surround with `**` * * * ### [hashtag](https://docs.akord.com/app/product-guides/notes#saving-a-note) Saving a note Once you have finished writing your note, click on the "Save note" button in the top right corner to save it. * * * ### [hashtag](https://docs.akord.com/app/product-guides/notes#how-much-it-cost-to-save-a-note) How much it cost to save a note? With 1 USD, you can save up to 1,500 documents securely forever (as of June 20th, 2022), assuming that one note is under 256KB, which is the smallest unit of storage on Arweave. To check the current price of the $AR token, please visit [ar-fees.arweave.devarrow-up-right](https://ar-fees.arweave.dev/) . There is no file size limit, as long as you have enough storage left on your account. Last updated 2 years ago * [Getting started](https://docs.akord.com/app/product-guides/notes#getting-started) * [Formatting text styles](https://docs.akord.com/app/product-guides/notes#formatting-text-styles) * [Using markdown](https://docs.akord.com/app/product-guides/notes#using-markdown) * [Saving a note](https://docs.akord.com/app/product-guides/notes#saving-a-note) * [How much it cost to save a note?](https://docs.akord.com/app/product-guides/notes#how-much-it-cost-to-save-a-note) --- # Change password | Akord docs Your password is like your shortcut to accessing your wallet the keys inside. Your password decrypts your wallet locally on your device. Your password is never sent to our servers. This way no one can access your wallet and, therefore, your data other than yourself or anyone you have invited to a vault. When you choose your password we evaluate it based on common passwords and patterns like dates, repeats (\`aaa\`), sequences (\`abcd\`), keyboard patterns (\`qwertyuiop\`) and l33t speak, all of which is referenced by password crackers. We enforce the strongest setting for your password to make it almost impossible that you will end up with a weak password susceptible to attacks. We recommend using an encrypted password manager to manage this and all your passwords. You can change your password by going to _Settings_ > _Security_ > _Change password._ **Unlike most digital service providers, we can’t reset your password if you forget it, as the password is never communicated to us. If you forget the password, you must use your recovery phrase to reset the password.** Last updated 2 years ago --- # Membership | Akord docs The vault owner can manage access to their vault by creating and maintaining memberships. New members can be assigned one of two roles: * **Contributor:** can publish new documents, assets, etc to the vault. * **Viewer:** can access the vault, view contents and download only. `**invite(vaultId, email, role)**` Invite user with an Akord account: * `vaultId` (`string`, required) * `email` (`string`, required) - invitee's email * `role` ([`RoleType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/membership.ts#L4) , required) - CONTRIBUTOR or VIEWER * `options` (`MembershipCreateOptions`, optional) - invitation email message, etc. * returns `Promise<{ membershipId, transactionId }>` - Promise with new membership id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example) Copy const { membershipId } = await akord.membership.invite(vaultId, "[email protected]", "VIEWER"); `**inviteNewUser(vaultId, email, role)**` Invite user without an Akord account: * `vaultId` (`string`, required) * `email` (`string`, required) - invitee's email * `role` ([`RoleType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/membership.ts#L4) , required) - CONTRIBUTOR or VIEWER * `options` (`MembershipCreateOptions`, optional) - invitation email message, etc. * returns `Promise<{ transactionId }>` - Promise with new membership id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-1) `**accept(membershipId)**` * `membershipId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-2) `**confirm(membershipId)**` * `membershipId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-3) `**reject(membershipId)**` Reject pending invitation: * `membershipId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-4) `**leave(membershipId)**` Reject already accepted invitation: * `membershipId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-5) `**revoke(membershipId)**` Revoke a membership, also update each valid membership with new rotated keys: * `membershipId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-6) `**changeRole(membershipId, role)**` * `membershipId` (`string`, required) * `role` ([`RoleType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/03e28ffd95224dbfd0a8d891a06a154298619378/src/types/membership.ts#L4) , required) - CONTRIBUTOR or VIEWER * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-7) `**inviteResend(membershipId)**` Resend email invitation: * `membershipId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-8) `**get(membershipId, options)**` * `membershipId` (`string`, required) * `options` ([`GetOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L9) , optional) * returns `Promise` - Promise with the membership object chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-9) `**listAll(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise>` - Promise with all memberships within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-10) `**list(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise<{ items, nextToken }>` - Promise with paginated memberships within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/membership#example-11) Last updated 2 years ago Copy const { membershipId } = await akord.membership.inviteNewUser(vaultId, "[email protected]", "VIEWER"); Copy const { transactionId } = await akord.membership.accept(membershipId); Copy const { transactionId } = await akord.membership.confirm(membershipId); Copy const { transactionId } = await akord.membership.reject(membershipId); Copy const { transactionId } = await akord.membership.leave(membershipId); Copy const { transactionId } = await akord.membership.revoke(membershipId); Copy const { transactionId } = await akord.membership.changeRole(membershipId, "CONTRIBUTOR"); Copy const { transactionId } = await akord.membership.inviteResend(membershipId); Copy const membership = await akord.membership.get(membershipId); Copy const memberships = await akord.membership.listAll(vaultId); Copy // retrieve first 100 memberships for the vault const { items } = await akord.membership.list(vaultId); // retrieve first 20 memberships for the vault const { items } = await akord.membership.list(vaultId, { limit: 20 }); // iterate through all memberships let token = null; let memberships = []; do { const { items, nextToken } = await akord.membership.list(vaultId, { nextToken: token }); memberships = memberships.concat(items); token = nextToken; } while (token); --- # Monitoring usage | Akord docs If you click on the storage icon in the main navigation, you'll be taken a dashboard where you can see your permanent and cloud storage. Each dashboard will show much storage you've used, and how that storage has been used across different file types. Hover on a different coloured section in the bar chart to see exactly how much of your storage has been used by a specific digital asset. [hashtag](https://docs.akord.com/app/product-guides/storage/monitoring-usage#verify-balance) Verify Balance ---------------------------------------------------------------------------------------------------------------- If you've uploaded many files and you're unsure about your usage, you can click _Verify balance_ in the top right to ensure it'll show you the most up-to-date calculation. Last updated 2 years ago --- # Note | Akord docs `**create(vaultId, content, name)**` * `vaultId` (`string`, required) * `content` (`string`, required) - note text content, ex: stringified JSON * `name` (`string`, required) - note name * `options` (`NoteCreateOptions`, optional) - parent id, mime type, etc. * returns `Promise<{ noteId, transactionId }>` - Promise with new note id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example) Copy const { noteId } = await akord.note.create(vaultId, "# Hello World", "Hello World note"); const { noteId } = await akord.note.create( vaultId, JSON.stringify({ name: "My first JSON note" }), "My first JSON note", { parentId: parentId, mimeType: "application/json" } ); `**uploadRevision(noteId, name, content)**` * `noteId` (`string`, required) * `content` (`string`, required) - note text content, ex: stringified JSON * `name` (`string`, required) - note name * `options` (`NoteOptions`, optional) - mime type, etc. * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-1) Copy const { transactionId } = await akord.note.uploadRevision(noteId, "# Hello World bis", "Hello World note bis"); `**move(noteId, parentId)**` * `noteId` (`string`, required) * `parentId` (`string`, optional) - new parent folder id * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-2) `**revoke(noteId)**` * `noteId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-3) `**restore(noteId)**` * `noteId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-4) `**delete(noteId)**` * `noteId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-5) `**get(noteId, options)**` * `noteId` (`string`, required) * `options` ([`GetOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L9) , optional) * returns `Promise` - Promise with the note object chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-6) `**listAll(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise>` - Promise with all notes within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-7) `**list(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise<{ items, nextToken }>` - Promise with paginated notes within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-8) `**getVersion(noteId, index)**` Get note text version by index, return the latest version by default * `noteId` (`string`, required) * `index` (`number`, optional) - note version index * returns `Promise<{ name: string, data: string }>` - Promise with note name & data string text chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/note#example-9) Last updated 2 years ago Copy // create new folder const { folderId } = await akord.folder.create(vaultId, "new folder"); // move the note to newly created folder const { transactionId } = await akord.note.move(noteId, folderId); Copy const { transactionId } = await akord.note.revoke(noteId); Copy const { transactionId } = await akord.note.restore(noteId); Copy const { transactionId } = await akord.note.delete(noteId); Copy const note = await akord.note.get(noteId); Copy const notes = await akord.note.listAll(vaultId); Copy // retrieve first 100 notes for the vault const { items } = await akord.note.list(vaultId); // retrieve first 20 notes for the vault const { items } = await akord.note.list(vaultId, { limit: 20 }); // iterate through all notes let token = null; let notes = []; do { const { items, nextToken } = await akord.note.list(vaultId, { nextToken: token }); notes = notes.concat(items); token = nextToken; } while (token); Copy // get the latest note version const { name: fileName, data: noteText } = await akord.note.getVersion(noteId); // get the first note version const { name: fileName, data: noteText } = await akord.note.getVersion(noteId, 0); --- # Uploading files | Akord docs When you upload your files, you will either be uploading them to permanent blockchain vaults or to cloud vaults. [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#selecting-and-confirming-files) Selecting and confirming files ------------------------------------------------------------------------------------------------------------------------------------------------------- Select your files from the + button, or drag and drop your files directly into the vault screen. We then ask you to check that selection, showing you all the files, how big each file is, the total upload size and the available storage you have. We provide this confirmation step for a couple of reasons. First, it's an additional check to make sure you're uploading to the correct storage type. You will either be uploading them to permanent blockchain vaults or to cloud vaults. Vault types have been explained **here.** ### [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#when-youre-uploading-to-permanent-blockchain-vaults) **When you're uploading to permanent blockchain vaults** It's important to remember you can't delete what you upload. Mistakenly uploading a 2 GB film instead of the 30 KB jpg you meant to click on is a costly error that can't be undone. You may not have enough available storage for all the files you selected to upload. So a modal with a final check provides you with the possibility to remove some files and continue with the upload, or go and top up your storage. It's also important to recheck the privacy setting of your vault. You don't want to permanently upload private data to a public vault where it's easily accessible for anyone. ### [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#when-youre-uploading-to-cloud-vaults) **When you're uploading to cloud vaults** You don't have to worry about the permanence of data, it can be easily removed. However, it's still important to check the privacy setting of your vault. You don't want to upload private data to a public vault where it's easily accessible. * * * [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#large-file-uploads) Large file uploads ------------------------------------------------------------------------------------------------------------------------------- On [v2.akord.comarrow-up-right](https://v2.akord.com/) there is theoretically no limit to the size of the file you can upload, but it will depend on your internet connection. We have had users upload files up to 12 GB over very slow internet connections, but this can take a long time. Please be patient if you're uploading large files. We advise using Chrome or Safari browsers when dealing with large files. Firefox has some known issues when dealing with encryption and decryption of large files in the browser. * * * [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#progress-bar) Progress bar ------------------------------------------------------------------------------------------------------------------- ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FFu2wmWG2eUULftjOTRrV%252FScreenshot%25202024-01-24%2520at%252012.10.45%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3D6eee61b8-a025-4fd2-b138-f71aad2592a0&width=768&dpr=3&quality=100&sign=51ea3f0e&sv=2) After you've hit upload, you'll see a progress bar showing your files are being uploaded. [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#posting-blockchain-transactions) Posting blockchain transactions --------------------------------------------------------------------------------------------------------------------------------------------------------- ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252F1FEZ4wUuVancvUk0gxuG%252FScreenshot%25202024-01-24%2520at%252012.14.22%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3Df6d3039e-2610-4458-b35d-9607f7fa9738&width=768&dpr=3&quality=100&sign=333c503a&sv=2) This is the final step where we prepare the transaction to post to Arweave. [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#upload-completed) Upload completed --------------------------------------------------------------------------------------------------------------------------- ![](https://docs.akord.com/~gitbook/image?url=https%3A%2F%2F1593374540-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F0GR33YblhLmalhKSoV1D%252Fuploads%252FA56Df1VnTHdUYuXqgDSE%252FScreenshot%25202024-01-24%2520at%252012.17.02%25E2%2580%25AFAM.png%3Falt%3Dmedia%26token%3D7b121175-19ee-40d1-9b12-011eaac969b8&width=768&dpr=3&quality=100&sign=9fea4045&sv=2) Once your upload is complete, you will see a green notification box at the bottom of the screen confirming your uploads. * * * [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#confirming-files-on-arweave) Confirming files on Arweave ------------------------------------------------------------------------------------------------------------------------------------------------- You can now exit the app and leave the rest to us. Committing files to the Arweave blockchain is not an instantaneous process. Committing new transactions on Arweave can take time and that time can vary. Sometimes the process can be a matter of minutes, and at other times with network congestion it can be much longer. circle-info Don't worry, whatever is happening with the Arweave network, we won't lose your data – we keep a cached version of your file (encrypted of course, if you make an upload to a private vault), giving you access to the file as soon as you upload it and before it gets committed on-chain, regardless of how long that takes. When you initially upload files you will see an orange dot appear on the file icon, indicating the file is with Akord, pending processing by Arweave. You will then see a yellow dot appear on the file icon which indicates that your file is with Arweave and is currently being processed by the network. While your files are in a pending state, you can view, move and rename them. If for any reason the file is rejected by Arweave, we automatically queue and repost the file, meaning it should always just be a matter of time before the file is committed. * * * ### [hashtag](https://docs.akord.com/app/product-guides/file-management/uploading-files#view-the-arweave-transaction) View the Arweave transaction You can view the Arweave transaction for your file on [viewblockarrow-up-right](http://viewblock.io/) – the blockchain explorer for Arweave. Go to the file menu and select "File info". Within the file info menu there is a "View transaction" option. Normally it will take ~15 minutes to confirm a transaction on Arweave. Last updated 2 years ago * [Selecting and confirming files](https://docs.akord.com/app/product-guides/file-management/uploading-files#selecting-and-confirming-files) * [When you're uploading to permanent blockchain vaults](https://docs.akord.com/app/product-guides/file-management/uploading-files#when-youre-uploading-to-permanent-blockchain-vaults) * [When you're uploading to cloud vaults](https://docs.akord.com/app/product-guides/file-management/uploading-files#when-youre-uploading-to-cloud-vaults) * [Large file uploads](https://docs.akord.com/app/product-guides/file-management/uploading-files#large-file-uploads) * [Progress bar](https://docs.akord.com/app/product-guides/file-management/uploading-files#progress-bar) * [Posting blockchain transactions](https://docs.akord.com/app/product-guides/file-management/uploading-files#posting-blockchain-transactions) * [Upload completed](https://docs.akord.com/app/product-guides/file-management/uploading-files#upload-completed) * [Confirming files on Arweave](https://docs.akord.com/app/product-guides/file-management/uploading-files#confirming-files-on-arweave) * [View the Arweave transaction](https://docs.akord.com/app/product-guides/file-management/uploading-files#view-the-arweave-transaction) --- # Account deletion | Akord docs You can delete your Akord Account at any time. If you change your mind, you might not be able to recover it. ### [hashtag](https://docs.akord.com/app/product-guides/account/account-deletion#step-1-learn-what-deleting-your-akord-account-means) Step 1: Learn what deleting your Akord account means * Your data and content like files, notes, and photos are still available and stored on-chain, but you will no longer be able to write and read this data over the Akord app. * You will not be able to use Akord services when you sign in with that account. ### [hashtag](https://docs.akord.com/app/product-guides/account/account-deletion#step-2-review-and-download-your-data) Step 2: Review & download your data Before you delete your account please take the following steps. * Review all the data you have stored on the Arweave blockchain through the Akord app. * All this data is still available and stored on-chain, but if you prefer you can download them locally. * If you wish to download data locally, we recommend that you do so prior to your account deletion request. circle-info Important: You can still access your data on-chain with your recovery phrase. Do not lose your recovery phrase, it will be your only option to access to your encrypted data on-chain (since public data can also be read directly from chain using e.g. [viewblock.ioarrow-up-right](http://viewblock.io/) ). To read encrypted data and easily find all your Akord uploads, you can use Akord Explorer (scheduled for release in early 2024) ### [hashtag](https://docs.akord.com/app/product-guides/account/account-deletion#step-3-delete-your-account) Step 3: Delete your account There are two ways to delete your account: 1. you can send us an email [\[email protected\]envelope](https://docs.akord.com/cdn-cgi/l/email-protection#5a3e3f363f2e3335341a3b3135283e74393537) ; or 2. go to the “Account” section in the app, then select “Security and Privacy”, then click “Delete account”. Once we receive your deletion request, the account will be deleted within 24 hours. circle-info It's a good idea to keep your recovery phrase even if you want to delete your account. Last updated 2 years ago * [Step 1: Learn what deleting your Akord account means](https://docs.akord.com/app/product-guides/account/account-deletion#step-1-learn-what-deleting-your-akord-account-means) * [Step 2: Review & download your data](https://docs.akord.com/app/product-guides/account/account-deletion#step-2-review-and-download-your-data) * [Step 3: Delete your account](https://docs.akord.com/app/product-guides/account/account-deletion#step-3-delete-your-account) --- # Blockchain transactions | Akord docs **This only applies to permanent storage.** At the bottom of the storage screen, there's a table listing all your storage transactions. Here you'll be able to see a history of your uploads and top ups, with details on file type, size and the time of the transaction. The icon on the far right side for an upload will take you directly to [viewblock.ioarrow-up-right](https://viewblock.io/) – the blockchain explorer for Arweave. A typical transaction would look like the image below, with details such as the amount $AR paid for the upload. Of course, your data is encrypted so you would not be able to access your file directly from this link. Longer term, we envisage deploying the whole Akord app directly on Arweave and the permaweb. This is how we can truly guarantee a 'pay once, store forever' model. Last updated 2 years ago --- # Stack (file) | Akord docs In an Akord vault, files and other assets are organized as 'stacks'. A stack represents one single file and all the subsequent revisions that may come after. `**create(vaultId, file, options)**` * `vaultId` (`string`, required) * `file` ([`FileLike`arrow-up-right](https://github.com/Akord-com/akord-js/blob/ab9bb814fa9cf73d9ed01052738c8b84a86040b2/src/types/file.ts#L8) , required) - file object - web: File, node: NodeJs.File (Blob implementation; web like File) * `options` (`StackCreateOptions`, optional) * returns `Promise<{ stackId, transactionId, uri }>` - Promise with new stack id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example) Copy const { stackId } = await akord.stack.create(vaultId, "./photo.jpg"); [See Next.js file upload showcase herearrow-up-right](https://github.com/Akord-com/recipes/blob/a2dbc847097973ef08586f32b0ce3192f0581ed4/nextjs-starter/src/pages/index.tsx#L66) `**import(vaultId, fileTxId)**` Create new stack from an existing arweave file transaction: * `vaultId` (`string`, required) * `fileTxId` (`string`, required) - arweave file transaction id reference * `options` (`NodeCreateOptions`, optional) - parent id, etc. * returns `Promise<{ stackId, transactionId }>` - Promise with new stack id & corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-1) Copy const { stackId } = await akord.stack.import(vaultId, "kzGxbFW_oJ3PyYneRs9cPrChQ-k-8Fym5k9PCZNJ_HA"); `**rename(stackId, name)**` * `stackId` (`string`, required) * `name` (`string`, required) - new stack name * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-2) `**uploadRevision(stackId, file)**` * `stackId` (`string`, required) * `file` ([`FileLike`arrow-up-right](https://github.com/Akord-com/akord-js/blob/ab9bb814fa9cf73d9ed01052738c8b84a86040b2/src/types/file.ts#L8) , required) - file object * `options` (`FileUploadOptions`, optional) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-3) `**revoke(stackId)**` * `stackId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-4) `**move(stackId, parentId)**` * `stackId` (`string`, required) * `parentId` (`string`, required) - new parent folder id * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-5) `**restore(stackId)**` * `stackId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-6) `**delete(stackId)**` * `stackId` (`string`, required) * returns `Promise<{ transactionId }>` - Promise with corresponding transaction id chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-7) `**get(stackId, options)**` * `stackId` (`string`, required) * `options` ([`GetOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L9) optional) * returns `Promise` - Promise with the stack object chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-8) `**listAll(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise>` - Promise with all stacks within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-9) `**list(vaultId, options)**` * `vaultId` (`string`, required) * `options` ([`ListOptions`arrow-up-right](https://github.com/Akord-com/akord-js/blob/193062c541ad06c186d5b872ecf9066d15806b43/src/types/query-options.ts#L1) , optional) * returns `Promise<{ items, nextToken }>` - Promise with paginated stacks within given vault chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-10) `**getVersion(stackId, index)**` Get file stack version by index, return the latest version by default: * `stackId` (`string`, required) * `index` (`number`, optional) - file version index * returns `Promise<{ name: string, data: ArrayBuffer }>` - Promise with file name & data buffer chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-11) `**getUri(stackId, type, index)**` Get stack file uri by index, return the latest arweave uri by default: * `stackId` (`string`, required) * `type` ([`StorageType`arrow-up-right](https://github.com/Akord-com/akord-js/blob/26d1945bee727a1af45f0f9cc44c7fa9b68c5d75/src/types/node.ts#L149) , optional) - storage type, default to arweave * `index` (`number`, optional) - file version index, default to latest * returns `Promise` - Promise with stack file uri chevron-rightexample[hashtag](https://docs.akord.com/api-and-dev-tools/build/sdk-akordjs/modules/stack-file#example-12) Last updated 2 years ago Copy const { transactionId } = await akord.stack.rename(stackId, "new name for your stack"); Copy const { uri } = await akord.stack.uploadRevision(stackId, "./photo.jpg"); Copy const { transactionId } = await akord.stack.revoke(stackId); Copy // create new folder const { folderId } = await akord.folder.create(vaultId, "new folder"); // move the stack to newly created folder const { transactionId } = await akord.stack.move(stackId, folderId); Copy const { transactionId } = await akord.stack.restore(stackId); Copy const { transactionId } = await akord.stack.delete(stackId); Copy const stack = await akord.stack.get(stackId); Copy const stacks = await akord.stack.listAll(vaultId); Copy // retrieve first 100 stacks for the vault const { items } = await akord.stack.list(vaultId); // retrieve first 20 stacks for the vault const { items } = await akord.stack.list(vaultId, { limit: 20 }); // iterate through all stacks let token = null; let stacks = []; do { const { items, nextToken } = await akord.stack.list(vaultId, { nextToken: token }); stacks = stacks.concat(items); token = nextToken; } while (token); Copy // get the latest stack version const { name: fileName, data: fileBuffer } = await akord.stack.getVersion(stackId); // get the first stack version const { name: fileName, data: fileBuffer } = await akord.stack.getVersion(stackId, 0); Copy // get the arweave uri for the latest file version const arweaveUri = await akord.stack.getUri(stackId); // get the arweave uri for the first file version const arweaveUri = await akord.stack.getUri(stackId, 0); --- # Account | Akord docs [Reveal recovery phrasechevron-right](https://docs.akord.com/app/product-guides/account/reveal-recovery-phrase) [Change passwordchevron-right](https://docs.akord.com/app/product-guides/account/change-password) [Account deletionchevron-right](https://docs.akord.com/app/product-guides/account/account-deletion) Last updated 2 years ago ---