API Reference

Complete reference for all Console Managed Wallet API endpoints.

Base URL: https://console-api.akash.network


Authentication

Every request must include the x-api-key header. Create and manage keys in Console under Settings → API Keys.

GET /v1/deployments HTTP/1.1
Host: console-api.akash.network
x-api-key: YOUR_API_KEY

Authentication errors return 401 Unauthorized:

{ "error": "Unauthorized", "message": "Invalid API key" }

Response envelope

Every JSON response is wrapped in a top-level data field, for example:

{ "data": { "...": "..." } }

For list endpoints, data contains both the array and a pagination object. All examples below show the full response body.


Errors

The API uses standard HTTP status codes. All error responses share the same JSON shape.

HTTP StatusCode stringDescription
400BadRequestThe request body or query parameters are invalid. Check message for details.
401Unauthorizedx-api-key is missing, expired, or invalid.
404NotFoundThe resource (dseq) does not exist or is not owned by the authenticated user.
429TooManyRequestsRequest rate exceeded. Wait before retrying.
500InternalServerErrorUnexpected server error. Retry with exponential backoff.

Error response schema:

{ "error": "string", "message": "string" }

API Versioning

Endpoints are prefixed with a version number (/v1/ or /v2/). Versions are independent. Upgrading one endpoint version does not affect others.

VersionStatusEndpoints
v1StableDeployments, bids, leases, deposit
v2StableDeployment settings (auto top-up)

Future breaking changes are introduced as a new version prefix, and prior versions remain available for a deprecation period announced in the changelog (https://github.com/akash-network/console/releases).


Pagination

GET /v1/deployments uses offset-based pagination via skip and limit.

ParameterTypeDefaultMinimumDescription
skipinteger00Number of records to skip (offset)
limitinteger10001Maximum records to return per page

The response includes a pagination object with total, skip, limit, and hasMore so you can drive a paging loop without guessing when to stop:

async function* getAllDeployments() {
let skip = 0;
const limit = 100;
while (true) {
const res = await fetch(
`https://console-api.akash.network/v1/deployments?skip=${skip}&limit=${limit}`,
{ headers: { "x-api-key": process.env.AKASH_API_KEY } },
);
const { data } = await res.json();
yield* data.deployments;
if (!data.pagination.hasMore) break;
skip += limit;
}
}

POST /v1/deployments

Create a new deployment from an SDL manifest and fund its escrow.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
data.sdlbodystringyesDeployment manifest in SDL (YAML) format, as a JSON string
data.depositbodynumberyesInitial escrow deposit in USD. Minimum 0.5
Terminal window
curl -X POST https://console-api.akash.network/v1/deployments \
-H "x-api-key: $AKASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "data": { "sdl": "version: \"2.0\"\n...", "deposit": 0.5 } }'
const res = await fetch("https://console-api.akash.network/v1/deployments", {
method: "POST",
headers: {
"x-api-key": process.env.AKASH_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ data: { sdl: sdlString, deposit: 0.5 } }),
});
const { data } = await res.json();

Response 201 Created:

FieldTypeDescription
data.dseqstringDeployment sequence ID
data.manifeststringRendered manifest blob to send with POST /v1/leases
data.signTx.codenumberCosmos tx code (0 = success)
data.signTx.transactionHashstringBroadcast transaction hash
data.signTx.rawLogstringRaw chain log
{
"data": {
"dseq": "1234567",
"manifest": "...",
"signTx": { "code": 0, "transactionHash": "ABCDEF...", "rawLog": "[...]" }
}
}

GET /v1/bids

List provider bids for a deployment. Poll until bids arrive.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
dseqquerystringyesDeployment sequence ID returned by create deployment
Terminal window
curl "https://console-api.akash.network/v1/bids?dseq=1234567" \
-H "x-api-key: $AKASH_API_KEY"
const res = await fetch(
`https://console-api.akash.network/v1/bids?dseq=${dseq}`,
{
headers: { "x-api-key": process.env.AKASH_API_KEY },
},
);
const { data: bids } = await res.json();

Response 200 OK (returns { "data": [] } while bids are pending):

FieldTypeDescription
data[].bid.id.ownerstringOwner address
data[].bid.id.dseqstringDeployment sequence ID
data[].bid.id.gseqnumberGroup sequence
data[].bid.id.oseqnumberOrder sequence
data[].bid.id.providerstringProvider address
data[].bid.id.bseqnumberBid sequence (chain height)
data[].bid.statestringBid state (e.g. open)
data[].bid.price.denomstringChain denom (e.g. uact)
data[].bid.price.amountstringChain amount in micro-units, per block
data[].bid.created_atstringChain height at creation
data[].bid.resources_offerarrayOffered CPU / memory / storage / GPU / endpoints
data[].escrow_accountobjectProvider’s bid escrow account
{
"data": [
{
"bid": {
"id": {
"owner": "akash1...",
"dseq": "1234567",
"gseq": 1,
"oseq": 1,
"provider": "akash1...",
"bseq": 92
},
"state": "open",
"price": { "denom": "uact", "amount": "10000" },
"created_at": "92",
"resources_offer": [{ "resources": { "...": "..." }, "count": 1 }]
},
"escrow_account": { "...": "..." }
}
]
}

Note: there is no flat bid.id string — the bid is identified by the composite {owner, dseq, gseq, oseq, provider, bseq}. When creating a lease, copy dseq, gseq, oseq, and provider from this object.


POST /v1/leases

Accept one or more provider bids and ship the manifest in a single call.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
manifestbodystringyesManifest blob returned by POST /v1/deployments
leasesbodyarrayyesOne entry per bid to accept
leases[].dseqbodystringyesDeployment sequence ID
leases[].gseqbodynumberyesGroup sequence (from bid.id.gseq)
leases[].oseqbodynumberyesOrder sequence (from bid.id.oseq)
leases[].providerbodystringyesProvider address (from bid.id.provider)
Terminal window
curl -X POST https://console-api.akash.network/v1/leases \
-H "x-api-key: $AKASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"manifest": "<MANIFEST>",
"leases": [
{ "dseq": "1234567", "gseq": 1, "oseq": 1, "provider": "akash1provider..." }
]
}'
const res = await fetch("https://console-api.akash.network/v1/leases", {
method: "POST",
headers: {
"x-api-key": process.env.AKASH_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
manifest,
leases: [
{
dseq: chosen.dseq,
gseq: chosen.gseq,
oseq: chosen.oseq,
provider: chosen.provider,
},
],
}),
});
const { data } = await res.json();

Response 200 OK is the same shape as GET /v1/deployments/{dseq} — see below.


POST /v1/deposit-deployment

Add USD funds to a deployment’s escrow to extend its runtime.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
data.dseqbodystringyesDeployment sequence ID
data.depositbodynumberyesDeposit amount in USD. Minimum 0.5
Terminal window
curl -X POST https://console-api.akash.network/v1/deposit-deployment \
-H "x-api-key: $AKASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "data": { "dseq": "1234567", "deposit": 0.5 } }'
const res = await fetch(
"https://console-api.akash.network/v1/deposit-deployment",
{
method: "POST",
headers: {
"x-api-key": process.env.AKASH_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ data: { dseq, deposit: 0.5 } }),
},
);
const { data } = await res.json();

Response 200 OK: full deployment object after the top-up; see GET /v1/deployments/{dseq} below. The new escrow balance is in data.escrow_account.state.funds[].amount (raw chain micro-units).


GET /v1/deployments

List all deployments for the authenticated user, with pagination.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
skipqueryintegernoOffset. Default 0
limitqueryintegernoMax records. Default 1000
Terminal window
curl "https://console-api.akash.network/v1/deployments?skip=0&limit=10" \
-H "x-api-key: $AKASH_API_KEY"
const res = await fetch(
"https://console-api.akash.network/v1/deployments?skip=0&limit=10",
{
headers: { "x-api-key": process.env.AKASH_API_KEY },
},
);
const { data } = await res.json();

Response 200 OK:

FieldTypeDescription
data.deployments[]arrayOne entry per deployment, same shape as GET /v1/deployments/{dseq} minus per-lease status
data.pagination.totalnumberTotal deployments for the user
data.pagination.skipnumberSkip value used
data.pagination.limitnumberLimit value used
data.pagination.hasMorebooleanTrue when more pages are available
{
"data": {
"deployments": [
{
"deployment": { "...": "..." },
"leases": [],
"escrow_account": { "...": "..." }
}
],
"pagination": { "total": 23, "skip": 0, "limit": 10, "hasMore": true }
}
}

GET /v1/deployments/{dseq}

Retrieve full details for a single deployment by its sequence ID.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
dseqpathstringyesDeployment sequence ID
Terminal window
curl "https://console-api.akash.network/v1/deployments/1234567" \
-H "x-api-key: $AKASH_API_KEY"
const res = await fetch(
`https://console-api.akash.network/v1/deployments/${dseq}`,
{
headers: { "x-api-key": process.env.AKASH_API_KEY },
},
);
const { data } = await res.json();

Response 200 OK:

FieldTypeDescription
data.deployment.id.ownerstringOwner address
data.deployment.id.dseqstringDeployment sequence ID
data.deployment.statestringDeployment state (active, closed)
data.deployment.hashstringManifest hash
data.deployment.created_atstringChain height at creation
data.leases[]arrayActive leases (composite id + state, price, created_at, closed_on, status)
data.escrow_accountobjectDeployment escrow account with funds[], deposits[], transferred[] (raw chain denoms)
{
"data": {
"deployment": {
"id": { "owner": "akash1ownerxxx...", "dseq": "1234567" },
"state": "active",
"hash": "...",
"created_at": "92"
},
"leases": [
{
"id": {
"owner": "akash1ownerxxx...",
"dseq": "1234567",
"gseq": 1,
"oseq": 1,
"provider": "akash1providerxxx...",
"bseq": 92
},
"state": "active",
"price": { "denom": "uact", "amount": "10000" },
"created_at": "92",
"closed_on": "",
"status": { "forwarded_ports": {}, "ips": {}, "services": {} }
}
],
"escrow_account": {
"id": { "scope": "deployment", "xid": "..." },
"state": {
"owner": "akash1ownerxxx...",
"state": "open",
"transferred": [],
"settled_at": "92",
"funds": [{ "denom": "uact", "amount": "5500000" }],
"deposits": []
}
}
}
}

PUT /v1/deployments/{dseq}

Update an active deployment with a revised SDL.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
dseqpathstringyesDeployment sequence ID
data.sdlbodystringyesUpdated SDL in YAML format, passed as a JSON string
Terminal window
curl -X PUT "https://console-api.akash.network/v1/deployments/1234567" \
-H "x-api-key: $AKASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "data": { "sdl": "version: \"2.0\"\n..." } }'
const res = await fetch(
`https://console-api.akash.network/v1/deployments/${dseq}`,
{
method: "PUT",
headers: {
"x-api-key": process.env.AKASH_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ data: { sdl: updatedSdl } }),
},
);
const { data } = await res.json();

Response 200 OK: full deployment object — same shape as GET /v1/deployments/{dseq}.


DELETE /v1/deployments/{dseq}

Close a deployment. Remaining escrow is returned asynchronously by the chain to your Console balance.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
dseqpathstringyesDeployment sequence ID to close
Terminal window
curl -X DELETE "https://console-api.akash.network/v1/deployments/1234567" \
-H "x-api-key: $AKASH_API_KEY"
const res = await fetch(
`https://console-api.akash.network/v1/deployments/${dseq}`,
{
method: "DELETE",
headers: { "x-api-key": process.env.AKASH_API_KEY },
},
);
const { data } = await res.json();

Response 200 OK:

{ "data": { "success": true } }

GET /v2/deployment-settings/{dseq}

Get auto top-up settings for a specific deployment. Settings are auto-created on first read.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
dseqpathstringyesDeployment sequence number
userIdquerystringnoDefaults to authenticated user
Terminal window
curl "https://console-api.akash.network/v2/deployment-settings/1234567" \
-H "x-api-key: $AKASH_API_KEY"
const res = await fetch(
`https://console-api.akash.network/v2/deployment-settings/${dseq}`,
{
headers: { "x-api-key": process.env.AKASH_API_KEY },
},
);
const { data } = await res.json();

Response 200 OK:

FieldTypeDescription
data.idstring (uuid)Setting record id
data.userIdstringOwning user id
data.dseqstringDeployment sequence number
data.autoTopUpEnabledbooleanWhether auto top-up is enabled
data.estimatedTopUpAmountnumberEstimated top-up amount per cycle (USD)
data.topUpFrequencyMsnumberTop-up cadence in milliseconds
data.createdAtstringISO-8601 creation time
data.updatedAtstringISO-8601 last update time
{
"data": {
"id": "00000000-0000-0000-0000-000000000000",
"userId": "00000000-0000-0000-0000-000000000000",
"dseq": "1234567",
"autoTopUpEnabled": true,
"estimatedTopUpAmount": 5,
"topUpFrequencyMs": 86400000,
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}
}

POST /v2/deployment-settings

Create deployment settings (typically used to enable auto top-up when the settings row does not yet exist).

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
data.dseqbodystringyesDeployment sequence number
data.autoTopUpEnabledbodybooleanyesEnable or disable automatic top-up
data.userIdbodystring (uuid)noDefaults to authenticated user
Terminal window
curl -X POST https://console-api.akash.network/v2/deployment-settings \
-H "x-api-key: $AKASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "data": { "dseq": "1234567", "autoTopUpEnabled": true } }'
const res = await fetch(
"https://console-api.akash.network/v2/deployment-settings",
{
method: "POST",
headers: {
"x-api-key": process.env.AKASH_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ data: { dseq, autoTopUpEnabled: true } }),
},
);
const { data } = await res.json();

Response 201 Created: same shape as GET /v2/deployment-settings/{dseq}.


PATCH /v2/deployment-settings/{dseq}

Update an existing settings row.

FieldLocationTypeRequiredDescription
x-api-keyheaderstringyesYour API key
dseqpathstringyesDeployment sequence number
userIdquerystring (uuid)noDefaults to authenticated user
data.autoTopUpEnabledbodybooleanyesEnable or disable automatic top-up
Terminal window
curl -X PATCH https://console-api.akash.network/v2/deployment-settings/1234567 \
-H "x-api-key: $AKASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "data": { "autoTopUpEnabled": false } }'
const res = await fetch(
`https://console-api.akash.network/v2/deployment-settings/${dseq}`,
{
method: "PATCH",
headers: {
"x-api-key": process.env.AKASH_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ data: { autoTopUpEnabled: false } }),
},
);
const { data } = await res.json();

Response 200 OK: same shape as GET /v2/deployment-settings/{dseq}.


See Also