Download OpenAPI specification:
Implemented non-custodial ERC-20 issuance API for sandbox integration.
Forja never holds private keys and never signs. Integrators authenticate with HMAC, request an issuance, receive an unsigned ERC-20 mint transaction, sign it in their own infrastructure, then report either a txHash or a rawSignedTransaction for Forja to relay and watch. This specification intentionally documents only the routes implemented in the current API.
Use this endpoint before starting integration. A successful response returns the issuer id, environment, and scopes attached to the API key.
{- "clientId": "string",
- "issuerId": "string",
- "scopes": [
- "string"
], - "environment": "sandbox"
}| status | string Enum: "active" "paused" "disabled" |
{- "data": [
- {
- "id": "string",
- "issuerId": "string",
- "symbol": "string",
- "name": "string",
- "decimals": 0,
- "network": "polygon-amoy",
- "contractAddress": "string",
- "implementationAddress": "string",
- "standard": "ERC20",
- "status": "active",
- "governanceMode": "eoa",
- "governance": {
- "type": "eoa",
- "signer": "string"
}, - "mintAuthority": {
- "type": "eoa",
- "minter": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]
}{- "id": "string",
- "issuerId": "string",
- "symbol": "string",
- "name": "string",
- "decimals": 0,
- "network": "polygon-amoy",
- "contractAddress": "string",
- "implementationAddress": "string",
- "standard": "ERC20",
- "status": "active",
- "governanceMode": "eoa",
- "governance": {
- "type": "eoa",
- "signer": "string"
}, - "mintAuthority": {
- "type": "eoa",
- "minter": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Creates an issuance in unsigned state and returns the full transaction to sign. HMAC clients must provide an Idempotency-Key header.
| tokenId required | string |
| Idempotency-Key required | string |
| amount required | string^\d+(\.\d+)?$ |
| destinationAddress required | string^0x[a-fA-F0-9]{40}$ |
| reference | string |
object |
{- "amount": "1000.00",
- "destinationAddress": "0x1111111111111111111111111111111111111111",
- "reference": "sandbox-test-001",
- "metadata": {
- "purpose": "amoy-poc"
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tokenId": "string",
- "issuerId": "string",
- "amount": "string",
- "destinationAddress": "string",
- "reference": "string",
- "metadata": { },
- "status": "unsigned",
- "unsignedTransaction": {
- "chainId": 0,
- "from": "string",
- "to": "string",
- "data": "string",
- "value": "string",
- "nonce": 0,
- "gasLimit": "string",
- "maxFeePerGas": "string",
- "maxPriorityFeePerGas": "string",
- "signingPayload": {
- "unsignedSerialized": "string",
- "signingHash": "string",
- "type": "eip1559"
}
}, - "txHash": "string",
- "rawSignedTransaction": "string",
- "preflight": { },
- "expiresAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| status | string (OperationStatus) Enum: "unsigned" "submitted" "confirmed" "failed" "expired" |
| tokenId | string |
| limit | integer [ 1 .. 200 ] Default: 50 |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tokenId": "string",
- "issuerId": "string",
- "amount": "string",
- "destinationAddress": "string",
- "reference": "string",
- "metadata": { },
- "status": "unsigned",
- "unsignedTransaction": {
- "chainId": 0,
- "from": "string",
- "to": "string",
- "data": "string",
- "value": "string",
- "nonce": 0,
- "gasLimit": "string",
- "maxFeePerGas": "string",
- "maxPriorityFeePerGas": "string",
- "signingPayload": {
- "unsignedSerialized": "string",
- "signingHash": "string",
- "type": "eip1559"
}
}, - "txHash": "string",
- "rawSignedTransaction": "string",
- "preflight": { },
- "expiresAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tokenId": "string",
- "issuerId": "string",
- "amount": "string",
- "destinationAddress": "string",
- "reference": "string",
- "metadata": { },
- "status": "unsigned",
- "unsignedTransaction": {
- "chainId": 0,
- "from": "string",
- "to": "string",
- "data": "string",
- "value": "string",
- "nonce": 0,
- "gasLimit": "string",
- "maxFeePerGas": "string",
- "maxPriorityFeePerGas": "string",
- "signingPayload": {
- "unsignedSerialized": "string",
- "signingHash": "string",
- "type": "eip1559"
}
}, - "txHash": "string",
- "rawSignedTransaction": "string",
- "preflight": { },
- "expiresAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Provide exactly one of txHash or rawSignedTransaction. If rawSignedTransaction is provided, Forja broadcasts it through the configured network RPC.
| issuanceId required | string <uuid> |
| txHash | string |
| rawSignedTransaction | string |
{- "txHash": "string",
- "rawSignedTransaction": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tokenId": "string",
- "issuerId": "string",
- "amount": "string",
- "destinationAddress": "string",
- "reference": "string",
- "metadata": { },
- "status": "unsigned",
- "unsignedTransaction": {
- "chainId": 0,
- "from": "string",
- "to": "string",
- "data": "string",
- "value": "string",
- "nonce": 0,
- "gasLimit": "string",
- "maxFeePerGas": "string",
- "maxPriorityFeePerGas": "string",
- "signingPayload": {
- "unsignedSerialized": "string",
- "signingHash": "string",
- "type": "eip1559"
}
}, - "txHash": "string",
- "rawSignedTransaction": "string",
- "preflight": { },
- "expiresAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Synchronous chain RPC relay for client backends that sign transactions outside Forja. Use it for gas, nonce, call, receipt, and raw transaction broadcast operations. The method allowlist is intentionally narrow.
| network required | string (Network) Enum: "polygon-amoy" "polygon" |
| jsonrpc | string Default: "2.0" Value: "2.0" |
| id | string or number or null |
| method required | string Enum: "eth_blockNumber" "eth_call" "eth_estimateGas" "eth_feeHistory" "eth_gasPrice" "eth_getBalance" "eth_getBlockByNumber" "eth_getTransactionByHash" "eth_getTransactionReceipt" "eth_sendRawTransaction" |
| params | Array of any Default: [] |
{- "jsonrpc": "2.0",
- "id": "balance-1",
- "method": "eth_getBalance",
- "params": [
- "0x1111111111111111111111111111111111111111",
- "latest"
]
}{- "jsonrpc": "2.0",
- "id": "string",
- "result": null
}Broadcasts a raw transaction signed by the client backend EOA and returns the transaction hash.
| network required | string (Network) Enum: "polygon-amoy" "polygon" |
| rawSignedTransaction required | string^0x[a-fA-F0-9]+$ |
{- "network": "polygon-amoy",
- "rawSignedTransaction": "0x02..."
}{- "txHash": "string"
}Returns the API secret once. Store it immediately.
| scopes | Array of strings (ApiScope) Default: ["tokens.read","issuances.read","issuances.create"] Items Enum: "tokens.read" "issuances.read" "issuances.create" |
{- "scopes": [
- "tokens.read",
- "issuances.read",
- "issuances.create"
]
}{- "apiKey": "string",
- "issuerId": "string",
- "scopes": [
- "tokens.read"
], - "environment": "sandbox",
- "isActive": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "apiSecret": "string"
}| apiKey required | string |
| isActive required | boolean |
{- "isActive": true
}{- "apiKey": "string",
- "issuerId": "string",
- "scopes": [
- "tokens.read"
], - "environment": "sandbox",
- "isActive": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}{- "data": [
- {
- "userId": "string",
- "issuerId": "string",
- "email": "user@example.com",
- "role": "admin",
- "status": "invited",
- "requireWebAuthn": true,
- "lastLoginAt": "2019-08-24T14:15:22Z",
- "invitedBy": "string",
- "invitedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]
}| email required | string <email> |
| role required | string (ConsoleRole) Enum: "admin" "operator" "viewer" |
| requireWebAuthn | boolean Default: false |
{- "email": "user@example.com",
- "role": "admin",
- "requireWebAuthn": false
}{- "userId": "string",
- "issuerId": "string",
- "email": "user@example.com",
- "role": "admin",
- "status": "invited",
- "requireWebAuthn": true,
- "lastLoginAt": "2019-08-24T14:15:22Z",
- "invitedBy": "string",
- "invitedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| userId required | string <uuid> |
| role | string (ConsoleRole) Enum: "admin" "operator" "viewer" |
| status | string Enum: "invited" "active" "disabled" |
| requireWebAuthn | boolean |
{- "role": "admin",
- "status": "invited",
- "requireWebAuthn": true
}{- "userId": "string",
- "issuerId": "string",
- "email": "user@example.com",
- "role": "admin",
- "status": "invited",
- "requireWebAuthn": true,
- "lastLoginAt": "2019-08-24T14:15:22Z",
- "invitedBy": "string",
- "invitedAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| id | string |
| symbol required | string |
| name required | string |
| decimals required | integer [ 0 .. 36 ] |
| network required | string (Network) Enum: "polygon-amoy" "polygon" |
| contractAddress required | string^0x[a-fA-F0-9]{40}$ |
| standard required | string Enum: "ERC20" "ERC20-upgradeable" |
| minter required | string^0x[a-fA-F0-9]{40}$ |
| governanceMode | string Default: "eoa" Value: "eoa" |
{- "id": "string",
- "symbol": "string",
- "name": "string",
- "decimals": 36,
- "network": "polygon-amoy",
- "contractAddress": "string",
- "standard": "ERC20",
- "minter": "string",
- "governanceMode": "eoa"
}{- "id": "string",
- "issuerId": "string",
- "symbol": "string",
- "name": "string",
- "decimals": 0,
- "network": "polygon-amoy",
- "contractAddress": "string",
- "implementationAddress": "string",
- "standard": "ERC20",
- "status": "active",
- "governanceMode": "eoa",
- "governance": {
- "type": "eoa",
- "signer": "string"
}, - "mintAuthority": {
- "type": "eoa",
- "minter": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| tokenId required | string |
| id | string |
| symbol required | string |
| name required | string |
| decimals required | integer [ 0 .. 36 ] |
| network required | string (Network) Enum: "polygon-amoy" "polygon" |
| contractAddress required | string^0x[a-fA-F0-9]{40}$ |
| standard required | string Enum: "ERC20" "ERC20-upgradeable" |
| minter required | string^0x[a-fA-F0-9]{40}$ |
| governanceMode | string Default: "eoa" Value: "eoa" |
{- "id": "string",
- "symbol": "string",
- "name": "string",
- "decimals": 36,
- "network": "polygon-amoy",
- "contractAddress": "string",
- "standard": "ERC20",
- "minter": "string",
- "governanceMode": "eoa"
}{- "id": "string",
- "issuerId": "string",
- "symbol": "string",
- "name": "string",
- "decimals": 0,
- "network": "polygon-amoy",
- "contractAddress": "string",
- "implementationAddress": "string",
- "standard": "ERC20",
- "status": "active",
- "governanceMode": "eoa",
- "governance": {
- "type": "eoa",
- "signer": "string"
}, - "mintAuthority": {
- "type": "eoa",
- "minter": "string"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}