This package contains TypeScript client library for Midjourney API by useapi.net.
Quick demo.
npm install @useapi/midjourney-api
Midjourney /imagine command available via jobs/imagine API endpoint.
Midjourney upscale or create variations and enhance or modify button commands available via jobs/button API endpoint.
Midjourney /describe command available via jobs/describe API endpoint.
Midjourney /blend command available via jobs/blend API endpoint.
Use jobs/?jobid=jobid API endpoint to retrieve job results.
Postman collection.
Swagger OpenAPI documentation for generating server stubs and client SDKs.
You need to set up and configure the Midjourey Discord account as well as subscribe to useapi.net service before you can start using API. Setup instructions.
import{createConfiguration,DefaultApi,ImagineResponse,ButtonResponse,BlendResponse,JobResponse,JobsButtonPostRequestButtonEnum,JobsBlendPostRequestBlendDimensionsEnum,DescribeResponse,}from'@useapi/midjourney-api';constsleep=(ms=0)=>newPromise(resolve=>setTimeout(resolve,ms));constconfiguration=createConfiguration({authMethods: {apiToken: {tokenProvider: {// Load api token from environment getToken(){returnprocess.env.USEAPI_TOKEN??'useapi.net API token'}}}}});// Load Discord settings from environment constdiscord=process.env.USEAPI_DISCORD??'Discord token';constserver=process.env.USEAPI_SERVER??'Discord server id number';constchannel=process.env.USEAPI_CHANNEL??'Discord channel id number';constapiInstance=newDefaultApi(configuration);// Helper function to monitor job status and retrieve resultsconstwaitForJobToComplete=async(job: ImagineResponse|ButtonResponse|BlendResponse|DescribeResponse|JobResponse)=>{constverb=job.verb.toUpperCase();console.log(`${verb} : ${job.status}`,job.jobid);while(job.code==200&&['started','progress'].includes(job.status)){awaitsleep(20*1000);// JobResponsejob=awaitapiInstance.jobsGet(job.jobid);console.log(`${verb} : ${job.status}`,{jobid: job.jobid,content: job.content});}if((jobinstanceofJobResponse)&&job.attachments?.length)console.log(`${verb} url`,job.attachments?.at(0)?.url);if((jobinstanceofJobResponse)&&job.buttons?.length)console.log(`${verb} buttons`,job.buttons?.join());returnjob;}constdemo=async()=>{// Midjourney /describe, using Promise patternapiInstance.jobsDescribePost({describeUrl: "https://mymodernmet.com/wp/wp-content/uploads/2017/12/free-images-national-gallery-of-art-9.jpg",
discord,
server,
channel,}).then(async(data: DescribeResponse)=>{console.log('DESCRIBE started',data);awaitwaitForJobToComplete(data);}).catch((error: any)=>console.error('DESCRIBE failed',error));// Midjourney /blend, using Promise patternapiInstance.jobsBlendPost({blendUrls: ["https://mymodernmet.com/wp/wp-content/uploads/2017/12/free-images-national-gallery-of-art-6.jpg","https://mymodernmet.com/wp/wp-content/uploads/2017/12/free-images-national-gallery-of-art-2.jpg"],blendDimensions: JobsBlendPostRequestBlendDimensionsEnum.Landscape,
discord,
server,
channel,}).then(async(data: BlendResponse)=>{console.log('BLEND started',data);awaitwaitForJobToComplete(data);}).catch((error: any)=>console.error('BLEND failed',error));// Midjourney /imagine, using await & try..catch patternletjob: ImagineResponse|JobResponse|ButtonResponse;try{// ImagineResponsejob=awaitapiInstance.jobsImaginePost({prompt: "Steampunk cat cycling in San Francisco, vintage photo",
discord,
server,
channel,});awaitwaitForJobToComplete(job);constimagineJobId=job.jobid;// Midjourney button, using await & try..catch patternjob=awaitapiInstance.jobsButtonPost({jobid: imagineJobId,button: JobsButtonPostRequestButtonEnum.V1});awaitwaitForJobToComplete(job);}catch(ex: any){console.log('IMAGINE or BUTTON failed',ex);}}demo();Version 1.0.4 | November 3, 2023
Added support for following jobs/button options:
- Upscale (2x)
- Upscale (4x)
- Redo Upscale (2x)
- Redo Upscale (4x)
Visit our
- Discord Server for any additional support and questions.
- YouTube Channel for tutorials and demos.