mjapi.io
Open in
urlscan Pro
2606:4700:3032::ac43:c979
Public Scan
Submitted URL: http://mjapi.io/
Effective URL: https://mjapi.io/
Submission: On February 23 via api from US — Scanned from DE
Effective URL: https://mjapi.io/
Submission: On February 23 via api from US — Scanned from DE
Form analysis
5 forms found in the DOM<form _ngcontent-ng-c413171865="" novalidate="" class="ng-untouched ng-pristine ng-invalid">
<div _ngcontent-ng-c413171865="" class="switch-container"><span _ngcontent-ng-c413171865="" class="switch-first-label switch-label">Fairy</span>
<div _ngcontent-ng-c413171865="" class="switch d-flex"><label _ngcontent-ng-c413171865="" class="switch"><input _ngcontent-ng-c413171865="" type="checkbox" name="accType" formcontrolname="accType" class="ng-untouched ng-pristine ng-valid"><span
_ngcontent-ng-c413171865="" class="slider round"></span></label></div><span _ngcontent-ng-c413171865="" class="switch-first-label switch-label">Self Served</span>
</div>
<div _ngcontent-ng-c413171865="" class="form-group mb-3"><input _ngcontent-ng-c413171865="" type="email" placeholder="Email" aria-label="Email" name="email" formcontrolname="email" class="form-control ng-untouched ng-pristine ng-invalid"><!---->
</div>
<div _ngcontent-ng-c413171865="" class="not-registered">
<div _ngcontent-ng-c413171865="" class="form-group mb-3 visually-hidden"><input _ngcontent-ng-c413171865="" type="text" placeholder="Username" aria-label="Username" name="username" formcontrolname="username"
class="form-control ng-untouched ng-pristine ng-valid"><!----></div><!---->
</div><!---->
<div _ngcontent-ng-c413171865="" class="row">
<div _ngcontent-ng-c413171865="" class="col-xs-12 d-flex justify-content-center"><button _ngcontent-ng-c413171865="" type="submit" class="btn btn-primary" disabled="">Go</button></div>
</div>
</form>
<form _ngcontent-ng-c2888554429="" novalidate="" class="ng-untouched ng-pristine ng-valid">
<div _ngcontent-ng-c2888554429="" class="form-control range"><input _ngcontent-ng-c2888554429="" type="range" min="1" max="100" step="1" id="btc-range" class="form-range ng-untouched ng-pristine ng-valid"></div>
<p _ngcontent-ng-c2888554429="" class="d-flex justify-content-center">10$</p>
<div _ngcontent-ng-c2888554429="" class="col-12 d-flex justify-content-center"><button _ngcontent-ng-c2888554429="" type="submit" class="btn btn-primary">Get</button></div>
</form>
<form _ngcontent-ng-c1585968777="" novalidate="" class="ng-untouched ng-pristine ng-valid">
<div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="key" placeholder="API key" formcontrolname="key" class="form-control ng-untouched ng-pristine ng-valid"></div>
<div _ngcontent-ng-c1585968777="" class="input-group mb-3"><textarea _ngcontent-ng-c1585968777="" type="text" name="prompt" placeholder="Prompt" formcontrolname="prompt" class="form-control ng-untouched ng-pristine ng-valid"></textarea></div>
<div _ngcontent-ng-c1585968777="" class="row mb-5">
<div _ngcontent-ng-c1585968777="" class="col-xs-12"><button _ngcontent-ng-c1585968777="" type="submit" class="btn btn-primary">Generate</button></div>
</div>
</form>
<form _ngcontent-ng-c1585968777="" novalidate="" class="ng-untouched ng-pristine ng-valid">
<div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="jobId" placeholder="Job id" formcontrolname="jobId" class="form-control ng-untouched ng-pristine ng-valid"></div>
<div _ngcontent-ng-c1585968777="" class="row mb-5">
<div _ngcontent-ng-c1585968777="" class="col-xs-12"><button _ngcontent-ng-c1585968777="" type="submit" class="btn btn-primary">Get progress</button></div>
</div>
</form>
<form _ngcontent-ng-c1585968777="" novalidate="" class="ng-untouched ng-pristine ng-valid">
<div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="key" placeholder="API key" formcontrolname="key" class="form-control ng-untouched ng-pristine ng-valid"></div>
<div _ngcontent-ng-c1585968777="" class="input-group mb-3"><input _ngcontent-ng-c1585968777="" type="text" name="jobId" placeholder="Job id" formcontrolname="jobId" class="form-control ng-untouched ng-pristine ng-valid"></div>
<div _ngcontent-ng-c1585968777="" class="row mb-5">
<div _ngcontent-ng-c1585968777="" class="col-xs-12"><button _ngcontent-ng-c1585968777="" type="submit" class="btn btn-primary">Cancel job</button></div>
</div>
</form>
Text Content
MIDJOURNEY API. SIMPLE. NO BS. Discover What is MidJourney™? MidJourney™ is a revolutionary text-to-image AI generation tool. You can use it exclusively via their official Discord bot. This would be fine for a few manual generations, but if you want to include it in an automated pipeline, you'll soon find that it's impossible, as there's no official API. MJAPI to the rescue! Our unofficial API is the solution to all your problems. Log in or Register Fairy Self Served Go How it works (Fairy) Register here and get your API Key via email. You get 1 day of free usage You're ready to go! Check the API Usage section Once your sub expires, you can extend it by any amount. Stripe, PayPal, BTC accepted Payment Fairy Self Served 1 DAY Trial ended? Get another sip 1$ 7 DAYS Not ready to commit? No problem 6$ 30 DAYS Full month access Renew manually 25$ SUBSCRIBE Full month access Auto-renews 22$ or BITCOIN Roughly $0.7 per day 10$ Get What do you get? Free Lunch 1 day of usage for new accounts – "The right to try" Instant Access You don't even need a password, we email you a key upon account creation and you're ready to go Simplified Workflow Everything is a GET request, test it directly in your browser's address bar, forget Postman Clear Pricing Pay for as little as 1 day, or subscribe for hassle-free auto-renewals Secure Transactions We partnered with Stripe and PayPal, the payment gateways we all know and love Support Reach out on discord or email whenever you need help or have questions Fairy Hassle-Free Setup No need for a separate Discord account or MidJourney subscription - start right away Shared Resource Efficiency Leverage our shared accounts for an eco-friendly experience, adhering to a fair-use daily limit Simplified Pricing Enjoy lower costs, ideal for users with basic needs that are trying out mjapi SelfServed Full Control Use your own MidJourney-enabled Discord account for a personalized experience Dedicated Resources Benefit from a dedicated worker, ensuring consistent performance and availability, with no daily limits Enhanced Privacy Manage your integration with the assurance of complete privacy and security API Usage GET addjob Request examples * Get 1 image, auto-upscaled: https://api.mjapi.io/addjob?key=YOURKEY&prompt=big strawberry --ar 16:9 * Get 4 images, then make adjustments: https://api.mjapi.io/addjob?key=YOURKEY&type=grid&prompt=big strawberry --ar 16:9 * Adjust a previous job's result: https://api.mjapi.io/addjob?key=YOURKEY&parent_id=123213&pick=U3 Fields * key (required): your API Key * prompt (required if type is not specified or type='oneshot_upscaled'): your prompt, but with any special characters encoded to form a proper URL (for ex., use %20 for spaces). You're likely already using a library, so escaping the URL is already be handled for you. Most browsers also replace spaces correctly in the URL bar, so you can test it easily. * type (optional): * oneshot_upscaled (default if pick is not given): Randomly chooses one image from the 4 possible variations and upscales it, returning a single image. This is the quickest way of generating an image without bothering with variations and such. This is the functionality we've initially built mjapi.io for. * grid: Generates 4 images, on which you can follow-up with another request to pick a adjustment. * followup (default if pick is given): Adjust the result of an existing job. No need to specify it, as it's implied when you pass the pick parameter. * pick: The adjustment to carry out on a previous job. Create variations (V1, V2, V3, V4), upscale (U1, U2, U3, U4) or make any other special adjustment such as 'Zoom Out 2x' (valid values are returned in the original response as followup_menu). This assumes no type is passed or type=followup. * parent_id (required if pick is given): the job id returned from a previous, completed, job. And before you ask, yes, you can follow-up on follow-ups. 👌 Response { "status": "success", "message": "Yummy!", "data": { "id": 5614325631231, "user_id": 4123172867356, "type": "oneshot_upscaled", "prompt": "photo of the moon taken from a luxurious skyscraper, starts glowing in space --ar 16:9 --version 5.1 --style raw", "progress": -1, "last_update": 1683876767, "result_url": null, "state": "new", "account_type": "fairy" } } Notable response fields * id (int): the job's id, that you can later use in other requests * type (enum str): oneshot_upscale, grid, followup * progress (int): -1 = pending; 0-99 = in progress; 100 = done. Here, it's usually -1, as the job didn't already start * result_url (str): available at any time after job transitions to 'in progress'. Useful for both partial and final results * state (enum str) : new, active, done, canceled, failed. Here, it's usually new or cancelled * account_type (enum str) : fairy, selfserve Try it now Generate Rate limiting There's a limit of 10 requests per 10sec. That's still a lot for 99% of users GET getjob Request example * Get a job's status https://api.mjapi.io/getjob?job_id=5614325 Fields * job_id: the job ID you've got from addjob Response { "status": "success", "message": "Yummy!", "data": { "id": 56143252232000, "user_id": 4123167356, "type": "oneshot_upscaled", "prompt": "photo of the moon taken from a luxurious skyscraper, starts glowing in space --ar 16:9 --version 5.1 --style raw", "progress": 55, "last_update": 1698658812, "result_url": null, "state": "active", "result_msg_id": null, "followup_menu": null } } Notable response fields * progress (int): -1 = pending; 0-99 = in progress; 100 = done * type (enum str): oneshot_upscale, grid, followup * state (enum str) : new, active, done, canceled, failed * result_url (str): available at any time after job transitions to 'in progress'. Useful for both partial and final results * result_msg_id (int): we don't talk about result_msg_id around here * followup_menu (str[]) : list of avaialable actions for initiating a follow-up job. Possible values: U1, U2, U3, U4, V1, V2, V3, V4, Vary (Strong), Vary (Subtle), Upscale (2x), Upscale (4x), Zoom Out 2x, Zoom Out 1.5x, ⬅, ➡, ⬆, ⬇. Try it now Get progress Rate limiting There's a limit of 10 requests per 10sec. That's still a lot for 99% of users GET canceljob Request examples * Cancel a job: https://api.mjapi.io/canceljob?key=YOURKEY&job_id=44321 Fields * key (required): your API Key * job_id (required): a job added via addjob. Response { "status": "success", "message": "Done", "data": null } Try it now Cancel job Rate limiting There's a limit of 10 requests per 10sec. That's still a lot for 99% of users FAQ Q1. DO I NEED A MIDJOURNEY SUB? No, only SelfServe accounts need to provide a MJ-enabled discord token Q2. FAIRY ACCOUNT LIMITS? Because resources are shared for this account type, we think it's only fair to put a 'reasonable use' cap per day per account. Currently, it's between 80-150 jobs per 24H, and jobs that never started don't count. Another limit, though obvious, is occasionally getting slower jobs due to increased overall load from other users. We're happy to see high usage, and this prompts us to add more horsepower to the backend, so on average everyone will have an decent experience Q3. AVAILABLE PAYMENT METHODS? We support Stripe (all packages), PayPal (except subs) and BTC/Lightning (pay any amount) Q4. WHAT ARE PERMA-CREDITS? Simple: instead of per-day, you pay per-job. They're only consumed if you don't have an active per-day plan. Pretty cool, huh? Q5. WHY GET AND NOT POST? We went full minimalistic here, the minimum effort for the desired result. It's really convenient to copy-paste the request directly in Chrome and see the result -- no Postman, curl etc. HTTPS makes sure the URL path/query etc. are encrypted, so nothing to be worried about. We might also mirror the current API via POST requests, if enough people ask for it Q6. HOW DO I CANCEL MY SUB? To cancel a Stripe sub, simply email us. If the email's subject matches 'please cancel my sub' exactly, it'll be automatically cancelled. Otherwise, we'll do it manually in 7-14 days. No worries, any extra charges will be refunded. Note that this doesn't return your initial payment, and you'll continue benefiting from the full existing sub. This merely cancels the auto-renewal, and it's how subs work in general (we're not reinventing the wheel here) Q7. CAN I GET A REFUND? Sure, shoot at hi@mjapi.io. This only works for Stripe one-time-payments (for subs see 'How do I cancel my sub?'). If the email's subject matches 'please refund my previous payment' exactly, and you've paid less than 7 days ago, it's done automatically. In case that doesn't happen, simply shoot us a follow-up email. Q8. WHAT IF MIDJOURNEY GETS THEIR OWN API? mjapi.io started as a solution we've built for ourselves, and several projects rely on it. We'll be too lazy to refactor all our front-ends. Instead, we'll keep using mjapi.io and just adapt our back-end, if needed. This means you won't notice a thing. 👍 Q9. WHY IS SELFSERVE MORE EXPENSIVE? For safety reasons, SelfServe accounts require a dedicated runner instance on our backend. This also means your prompts will get executed faster, since there's no queue (unlike Fairy accounts) Q10. HOW LONG SHOULD THE PROMPT BE? At the moment, we limit prompts to 1000 chars for Fairy and 3000 for SelfServe, but before thinking about reaching those lengths, please read: https://mid-journey.ai/midjourney-prompt-length/ Blog Discord hi@mjapi.io Terms of Use Privacy Policy 2024 mjapi.io. All Rights Reserved Other searches for midjourney include midjourner, midjourn, midgerny, midjournez, mid journey al, middlejourney ai, midhurney, midjarny, midjourn ey, midjourne y, midjourneyia, midjurni, mishourney, mitjurny, modjournet WE USE COOKIES 🍪 Accept allReject all Privacy