Screenshot automation for Oracle APEX

Last modified on October 2, 2026 • 2 min read • 354 words

Goal: collect screenshots for each page of an Oracle APEX application in order to prepare a user documentation.

I considered a custom developement for automating screenshots but I realized that it was not trivial and I had a look to an online service instead. There are plenty of these kinds of service and I tested the following subset, considering only ones providing a rest API:

On line service Basic Plan Evaluation Drawbacks
pikwy 3€/month + 0,003/snapshot Very good ok with apex.oracle.com but Impossible to access a free tier instance (timeout). Possible to access protected pages.
apiflash Free with a limit of 100 snapshots/month (upgrade at 7€/month) Very good not possible to access protected pages
screenshotmachine Free with a limit of 100 screenshots/month (upgrade at 9€/month) Very good not possible to access protected pages
site-shot 5€/mont for 2000 snapshots Very good not possible to access protected pages
url2png 29€/month for 5000 screenshots not tested
getscreenshotapi 5€Month for 2500 screenshots not tested

Finally, I realized my prototype with apiflash and I choosed the “Sample Cards” application as a demo case.

It’s just a matter of calling the screenshot API for each page ( https://api.apiflash.com/v1/urltoimage ) and put the result in a companion able (DEMO_BLOB). cf procedure code after and a sample display app.

Important: The API doesn’t deals with authentication, so I set a new scheme at “No authentication”, for the duration of the test, at least, then I switch back to the regular auth scheme. Pickwy allows providing credentials, but suffers a specific anomaly in may case (cf above)

Limitations: the modal pages can’t be managed this way, except if API gives opportunity to send keystrokes before, or navigating possibilities.

image

Sample procedure  

procedure buildscreens (pid number)
is
    turl varchar2(2000) := 'https://api.apiflash.com/v1/urltoimage?access_key=   <ACCESS_KEY>&url=<APEX_ENCODED_URL>';
    l_blob    BLOB; 
    tbody    CLOB;
    target varchar2(2000);
 
begin

    for c in (select page_alias, page_name 
              from APEX_APPLICATION_PAGES 
              where application_id=pid and PAGE_ALIAS IS NOT NULL 
              ) loop
        target := turl || lower(c.PAGE_ALIAS);
        l_blob := APEX_WEB_SERVICE.make_rest_request_b( 
            p_url         => target ,
            p_http_method => 'GET'
        ); 
        insert into demo_blob(image, page_name) values (l_blob, c.page_name);
        commit;
        if apex_web_service.g_status_code = 404 then
          null;
          -- return '1';
        end if;
    end loop;
end;
Follow me

I work on everything coding and tweet developer memes