Initial Asset Registration
Before starting
There are three major methods for turning your digital media files into Captures, registering them as Web3 assets, and accessing the Capture ecosystem. These methods include:
Using the Capture Cam
Using the Capture Dashboard
Registering with the Capture API
This page will primarily focus on the third method, registration with the API.
Register Captures
Registering assets via API is a simple way to create Captures. You will need to acquire your Capture Token before uploading the file. If you do not already have a Capture Token yet, please follow the instruction provided to create one.
The API key is optional. If you possess an API key, it's advisable to include it in the header as it helps in recording the name of the service where the asset was registered.
The Capture API is a pay-as-you-go system, which means you only pay for the API calls you make. This is a cost-effective way to use the API and it allows you to control your expenses. Make sure to top up and ensure sufficient funds in your wallet in the form of Credits or NUM to cover the cost. Payment for services is processed using NUM; if you want to know how much it costs in USD, you can check CoinGecko or CoinMarketCap.
C2PA support for asset registration
The asset registration API automatically read any C2PA metadata attached to an asset, provided the file type is included in the supported C2PA file type list. Due to variations in how different C2PA software providers manage metadata within the C2PA manifest, not all assets with C2PA metadata will offer complete provenance information for Numbers on-chain integrity records. Below is a detailed list of supported C2PA software providers and the specific information that can be utilized in the integrity record Asset Tree.
C2PA Provider | Asset Tree Field Support |
---|---|
Adobe Photoshop |
|
Adobe Firefly |
|
Microsoft Copilot |
|
Numbers Protocol |
|
OpenAI |
|
Register asset
POST
https://api.numbersprotocol.io/api/v3/assets/
Cost: 0.025 NUM per API call + Gas (~0.004 NUM per transaction)
Headers
Name | Type | Description |
---|---|---|
Authorization* | String | Example
|
Content-Type | String |
|
X-Api-Key | String |
|
Request Body
Name | Type | Description |
---|---|---|
asset_file* | Object | The content file to be registered. It can be any file format, and its file size must not exceed the upload limit in the pricing plan. |
meta | String | JSON string containing proof and information to be registered. |
caption | String | The brief description of the content file. The value will be set to Asset Tree's abstract. |
headling | String | The title of the content file. The length limit is 25 characters. |
image_file | Object | It's preferable to provide an image file when the asset file is not an image. It is necessary to have an image (PNG, JPG, or GIF, etc.) for previewing your item in such cases. |
nit_commit_custom | Object | Set Asset Tree values. For a field defined in Asset Tree schema, its value will override the existing value; for a field not defined in Asset Tree schema, it will be added in the Asset Tree as a custom field.
|
public_access | String | When registering asset, add and pin the file on the Numbers IPFS gateway. Default: |
signature | String | JSON string containing a list of signatures which were used to sign the data or metadata. |
signed_metadata | String | The signed metadata which could be verified with signature. |
Please note that proof
session is a required part of your metadata. The hash
, mimeType
, and timestamp
fields may be left empty, as the Capture backend will automatically calculate these values for you, as shown in the example above.
However, the more information you provide, the more your assets are, which also make them more "decentralized". The example of meta
can be found here.
It's preferable to provide an image file when the asset file is not an image. For more information on how this registration API works, please refer to the API documentation.
Adding signatures
To safeguard asset integrity in the Capture system, Capture employs client-side digital signatures based on Ethereum's EIP-191 standard. This approach guarantees that asset metadata remains in a verifiable and secure state. When you're registering an asset, enhancing its authenticity can be achieved by including two optional JSON string fields: signed_metadata
and signature
. Here’s how they work:
Details on signed_metadata
The signed_metadata
field is essential for storing the metadata poised for signing. For specifics on what this metadata entails and guidance on generating it, do take a look at our IntegrityCid page.
The Structure of signature
The signature
field should contain the actual digital signature. An example format is as follows:
Field Name | Description |
---|---|
proofHash | The sha256sum of the asset. |
provider | Signature provider's name. |
signature | The signature generated by EIP-191 standard. |
publicKey | The Ethereum wallet address used for signing. |
integritySha | The sha256sum of signed_metadata. |
By opting to include these fields, you're adding an extra layer of security to your asset registration process, reinforcing the trustworthiness of each asset within the Capture system.
You may generate signature using the example JavaScript code below. You will need to install the required package by using command npm i ethers @numbersprotocol/nit
.
For implementation details of nit.getIntegrityHash
and nit.signIntegrityHash
used in the signature generation process, visit GitHub Repository of the open-sourced "Git for Web3 assets" tool Nit for details. The implementation of the above functions can be found at the page.
For verification of signatures, see Asset Signature Verificationfor details.
Additional Capture information
Additional information in Capture is important because it helps to build trust and transparency in the digital media assets that are created and stored on the decentralized web. Having detailed information about an asset, such as its creation date, location, and owner, is crucial for establishing its authenticity and provenance. More verifiable information, more provenance of your Captures.
Adding information to a Capture is straightforward, one just needs to extend the information blocks during the asset registration. Information blocks can be defined as follows:
The provider
field refers to the source of the information block, while the name
field represents the name of the information block. The value to be registered should be placed in the value
field. This allows for clear and organized storage of information about the Capture.
The following shows some pre-defined information blocks:
Provider | Name | Sample Value |
---|---|---|
InfoSnapshot | creationGPSAddress | No. 299, Section 4, Bade Road, Songshan District Taipei City |
InfoSnapshot | Timestamp | 2021-04-23T02:30:00.279Z |
InfoSnapshot | creationGPSLatitude | 25.049190 |
InfoSnapshot | creationGPSLongitude | 121.566440 |
InfoSnapshot | Device Build Tags | android |
InfoSnapshot | GPSVerticalAccuracy | 8.0 |
Exif | GPSAltitude | -4.617279052734375 |
Exif | GPSBearing | 212.94905 |
Exif | GPSverticalAccuracyMeters | 8.0 |
Exif | GPSLongitude | 121,31,50.861E |
Exif | GPSLatitude | 25,2,42.842N |
Android | Manufacturer | Samsung |
Android | DeviceName | Samsung Galaxy Fold 4 |
Sensor | Accelerometer | SensorData(accuracy=3.0, value=[-2.2584498, 5.544669, 7.7695217]) |
Sensor | GameRotationVector | SensorData(accuracy=3.0, value=[0.28894028, 0.089926116, -0.077565834, 0.94995135]) |
Sensor | Gravity | SensorData(accuracy=NO_UPDATE_RECEIVED_DURING_SNAP, value=[-2.1173487, 5.2436786, 8.011802]) |
Sensor | Gyroscope | SensorData(accuracy=3.0, value=[0.0090546375, 0.0026631376, 0.011718297]) |
PGP | Public Key | ----BEGIN PGP PUBLIC KEY BLOCK-----Version: BCPG v@RELEASE_NAME@mQINBF5emRQBEAC0YLMyonrxA==YeTD-----END PGP PUBLIC KEY BLOCK----- |
IPFS | Nid | bafybeie23hdjuurtc5n77vbhjx6mmrmjo3lyzmtks4eki5ibwpqjoeb3eq |
Signature verification
Verifying a signature is crucial for ensuring the authenticity and integrity of data. Signatures are used to confirm that data or assets have not been tampered with and originate from a trusted source. In this guide, we'll walk through the process of verifying a signature. After registering a Capture with Capture Cam or Capture Dashboard, you can verify the asset signature by calling the "verify signature" endpoint. To call the "verify signature" endpoint, you will need two pieces of information:
CID: Asset ID which can obtain from the response received after registering a Capture.
Public Key: This should be the same public key used when adding signatures.
Verify an asset with an Ethereum address
Return status 200
if the asset is signed by the private key of the Ethereum address. Return status 400
if the verification fails.
Ok
If the signature is valid, you will receive a 200 OK similar to Response: Signature verified. However, if the signature is not valid, the response will be in the 40x range similar to Response: Signature not verified, indicating an error.
Query user's assets
GET
https://api.numbersprotocol.io/api/v3/assets/
The following API endpoint can be used to query asset information.
Cost: Free
Query Parameters
Name | Type | Description |
---|---|---|
limit | Number | Pagination size. Default: 200 |
offset | Number | Starting index of the assets. Default: 0 |
Headers
Name | Type | Description |
---|---|---|
Authorization* | String | Example
|
Import assets from their NFTs
POST
https://api.numbersprotocol.io/api/v3/assets/import/
The importing API endpoint is used for importing NFTs.
Cost: 0.1 NUM per API call + Gas (~0.004 NUM per transaction)
Headers
Name | Type | Description |
---|---|---|
Authorization* | String | Example
|
Content-Type | String |
|
X-Api-Key | String |
|
Request Body
Name | Type | Description |
---|---|---|
nft* | Object | The imported NFT. nft_chain_id nft_contract_address nft_token_id |
signed_metadata | String | The signed metadata which could be verified with signature. |
meta | String | JSON string containing the metadata of the asset_file provided by user. |
signature | String | JSON string containing a list of signatures which were used to sign the data or metadata. |
image_file | Object | The image file. Its size should not exceed 100 MB. |
The nft
is required to import an NFT from Numbers Search Engine.
If the NFT owner is not the user's asset wallet, the signed_metadata
and signature
are also necessary. These will be used to validate the address that signed the signed_metadata
as the NFT owner.
It is recommended to provide an image_file
when the NFT's image is not in image file format.
If the owner of the imported NFT is the user's asset wallet, the user can perform any NFT operation, including forcing a re-mint of an asset, exporting an asset, creating a transaction, creating an asset-origin product, creating an asset-clone product, or creating pack products from a series. However, if the owner is not the user's asset wallet, the user can only mint new NFTs (create child assets), which includes creating an asset-clone product, and creating pack products from a series.
Last updated