Alkaar / resy-booking-bot

🔫 Helps to snipe hard to get reservations at restaurants that use resy
395 stars 214 forks source link

Bot Getting Beat Out... #41

Closed anoneyecon closed 1 year ago

anoneyecon commented 2 years ago

Everything appears to be working fine (I think...), but when it attempts to snipe the bot still keeps missing the shot. Not sure if I'm just going for too highly demanded reservations or if there's a way to speed it up.

Any advice or recommendations would be appreciated.

Alkaar commented 2 years ago

I would first look into perhaps changing the logging and seeing the list of reservations that are available. I've noticed that restaurants sometimes have very weird time slots available (e.g. reservations at 5 PM or 9 PM and later and nothing in between). The bot is purposely set to not dump out the output because that would slow the bot down. It uses log4j which if you are familiar with it, you can just set it to debug mode, and then it will dump out the API responses.

Iampicklerick commented 2 years ago

Take Don Angie in NYC for example - this spot opens reservations 7 days out at 9am. I was on at that time and instantly the slots from 7-8:30 were all gone, they never even showed up. And not even one full second later, the rest of the times were all gone. Every slot taken in 2 seconds.

So the question: is there a way to speed this code up even further to beat other bots? Seems like more people are deploying their own.

Alkaar commented 2 years ago

instantly the slots from 7-8:30 were all gone, they never even showed up.

Per my statement above, they don't always have all times available. I noticed that many of the top restaurants have very weird times available. Many only have like 5 to 5:30 PM and then 9 PM and afterwards. I have tried Don Angie once or twice simply to see the times that are available and it does have weird times. Also Don Angie is a very tiny restaurant so likely you are fighting for very few spots as well.

Now if on the initial query, you see the available times and it's not able to get any of those time slots, then perhaps it is getting beat out. Are there days that sometimes I don't get a reservation? Sure it happens. But realize even if you have the fastest bot and 9 other people do as well, you can only reasonably win 10% of the time.

I can try experimenting with Don Angie a bit to see if I'm seeing the same issue as you but it will take a bit of time for me to come to any conclusion since I can only try once a day on top of other reservations I'm trying to get.

J-clouds commented 2 years ago

I love this bot but it seems to take the bot 8 seconds to complete a snipe...any way to speed this up via more concurrent processes? I think other bots may be going slightly faster & out sniping.

I tried to get 4 Charles Prime Rib 3 days in a row and kept on getting out sniped :(

Alkaar commented 2 years ago

it seems to take the bot 8 seconds to complete a snipe

What really matters is the time from when the bot runs to the moment it tries to book the reservation. For me, this is about 2-3 seconds. The API call to book the reservation can sometimes take more than 5 seconds to return. There is nothing you can do here as it's up to resy to return the response.

I tried to get 4 Charles Prime Rib 3 days in a row and kept on getting out sniped

This is similar to what I mentioned above. Many popular restaurants have weird reservation times. In some cases, I try to grab any reservation between 5 PM and 9 PM. This is why I added support for a priority list of reservation times because the list of available times can change from day to day and are usually very sparse. FWIW, I almost always get a reservation at 4 Charles so I think it has something to do with the times you are sniping @J-clouds.

any way to speed this up via more concurrent processes?

So I wrote the bot in a certain way, find available reservations, pick one, then grab it. In following that workflow, this is basically the fastest it can be aside from picking faster libraries or a "faster programming language". Since it's a single dependent workflow, more concurrent processes does not help here.

You can skip the first step in finding a reservation and just do a blind snipe. The concern here is of course it's a blind snipe. So you'd have to blind snipe all available spots. The problem here is you leave it up to fate of what reservation you end up getting. Also, I don't particularly want to bombard resy with a ton of requests. It's basically a DDOS and I imagine they could ban people for doing that.

You can blind snipe in priority order but I've noticed that many popular restaurants already have very few spots available. So you'd have to be lucky in knowing what spots they tend to make available and then sniping it. While it may increase the success rate, it makes the usability of this bot much too complicated and I opted to optimize for ease of use.


In conclusion, I'm apt to not change anything here. I did try Don Angie today and I got a table. I'll keep on testing it out and you are more than welcome to try to help me improve it but in this case, I would rather optimize for utility than speed. If there is one restaurant I can't get a reservation at but it works well enough for the rest, I'm ok with that.

This may not be the most desirable answer but I hope you understand my reasoning around this.

seanmcquade20 commented 2 years ago

I did try Don Angie today and I got a table

Any particular advice for Don Angie specifically? I've tried every day at 9am for the last week and have even had 5pm at the top of the priority list to try improve my chances but haven't been able to secure anything. Every other restaurant I've tried, I've managed to secure a reservation (so thank you so much for that!).

J-clouds commented 2 years ago

Thanks for your response! This makes lots of sense - you definitely did a good job with the coding so I want to make sure it's clear I genuinely appreciate it. Just thinking about how we can continue to optimize it, is there a possibility to add a range of times in which the bot can choose from? I know I can leave the time blank & the bot will choose any open time but it could be really good to enable the bot to choose any open time between 5-7pm for example. What do you think?

Alkaar commented 1 year ago

Any particular advice for Don Angie specifically?

So I've not sniped it more than the one time I tried but a few things I can share...

Alkaar commented 1 year ago

I want to make sure it's clear I genuinely appreciate it.

Heard you loud and clear! It's great to hear the praise and that people are getting value out of it!

is there a possibility to add a range of times in which the bot can choose from?

This is an interesting thought. I would like the interface to be clean in terms of going for specific time slots or a range of times. I chose to go with specific times as it provided the highest granularity and can easily support searching a range of times. It would be nice to have a more succinct way to search for a range of times but I'll have to think about it. It's not necessarily providing any new functionality it's not really at the top of my list of things to add.

I know I can leave the time blank & the bot will choose any open time

Not sure what you meant here but I don't think you can actually leave the time blank unless this is a bug and I completely missed this use case.

J-clouds commented 1 year ago

Regarding setting the time blank, I thought that's what you wrote here: image

Do I not leave it blank if I want the bot to auto-choose a time for me?

Alkaar commented 1 year ago

So what I mean by this is, if you don't set the table type, it will pick any table time for that specific time slot. The time is always required. The table type is always optional. I updated the documentation in this PR (👉 https://github.com/Alkaar/resy-booking-bot/pull/59) to make that a little bit more clear.

Alkaar commented 1 year ago

BTW @seanmcquade20, I've tried a few more times and I've been able to more or less reliably get reservations at Don Angie. Their time slot availability is less consistent so you do may have to widen your search criteria to increase your chances of success.

J-clouds commented 1 year ago

How do you widen your search criteria and know what time slots to specifically choose? That's the hardest part for me bc if they're fully booked immediately, I don't even know what time slots to put into the bot...does that make sense?

Alkaar commented 1 year ago

You just add more times you want. That's why I made it with a priority list as it searches in that order. Most restaurants have 15-minute time increments so you really just need to play with it.

J-clouds commented 1 year ago

That's what I did and for the last 3 days in a row, it got beat out every day...Here's the setup: image

And here's the response every time in the last 3 days: image

Am I doing something obviously wrong? It seems to work fine for restaurants that aren't in high demand but doesn't seem to work for the high demand restaurants

pezpa commented 1 year ago

That's what I did and for the last 3 days in a row, it got beat out every day...Here's the setup: image

And here's the response every time in the last 3 days: image

Am I doing something obviously wrong? It seems to work fine for restaurants that aren't in high demand but doesn't seem to work for the high demand restaurants

I see that your table size is 1. I've noticed that looking at Don Angie, the minimum table size that I can select is 2. That could also be an issue.

chambers98 commented 1 year ago

Any particular advice for Don Angie specifically?

So I've not sniped it more than the one time I tried but a few things I can share...

  • While the site says the two table types are Cabin Outdoors and Indoor Dining, they are actually called Cabin Outdoor and Indoor Table in the actual return response. So if you were sniping those table types specifically, you would actually come up empty. How I was able to get it was that I just didn't set the table type which basically grabs any available slot.
  • I also tweaked my bot to spit out the actual available time slots and the ones that were available were a few around/after 4 PM, 6 PM, and 8 PM. So actually there were none available at 5 PM. So as I mentioned above, it's best shoot for any reservation within a time window vs hoping for a specific time slot.

Thank you so much for this code! It's working great. Not an issue but just two questions, if you know (and if not feel free to ignore): 1) have you found that the popular restaurants (specifically wondering about Don Angie and I Sodi) are consistent in the times they put up every day? I've also noticed that they only have weird times available when I check, but I haven't checked often enough to see if it varies at all by day (i.e. I've never seen the 6 or 8pm time slot at Don Angie). 2) how do you make the tweak to the bot to spit out all the available time slots? I'd like to implement that if it's relatively easy

Alkaar commented 1 year ago

Thank you so much for this code! It's working great. Not an issue but just two questions, if you know (and if not feel free to ignore):

Really appreciate the compliments! Keeps me motivated to improve or at least to maintain this code.

  1. have you found that the popular restaurants (specifically wondering about Don Angie and I Sodi) are consistent in the times they put up every day? I've also noticed that they only have weird times available when I check, but I haven't checked often enough to see if it varies at all by day (i.e. I've never seen the 6 or 8pm time slot at Don Angie).

I find this varies. Some restaurants have the same consistently weird times (e.g. only 5 PM to 5:30 PM available then 9 PM and after) or the times are all over the place. For Don Angie specifically in testing it out for a week or so, I found the times vary a lot and like every 3rd or 4th day, there are zero spots available which I assume is because it's booked for a private event. TL;DR, every restaurant is different and you have to query it a few times on different days to see which tables tend to be available.

  1. how do you make the tweak to the bot to spit out all the available time slots? I'd like to implement that if it's relatively easy

I assume you mean make that change, not implement since it's already implemented 😛. It's pretty easy. Just go into log4j2.properties and change all instances of info to debug. This will drastically slow down the bot. It will literally add seconds to the snipe but the intent of this is so you can see more of the details of what is going on, including the available reservations.

shaggy2626 commented 1 year ago

How do you know what time reservations open? For example I'm trying to book Casa Cruz but don't know what time to set the snipe for, Thank you.

Alkaar commented 1 year ago

@martykebke see my reply below.

@Alkaar I'm struggling to get into Don Angie / 4 Charles consistently on Friday/Saturday even with a wide number of times.

Honestly, you should give an even wider number of times. I basically snipe for every time slot from open to close in 15-minute increments.

Here's my attempt today at 4 Charles which looks as though it retried 7pm over and over before shutting down:

What I noticed is that the same time slot has multiple unique booking tokens. So even though you might have not gotten that slot, you can still get the same slot with a different token so it will retry the same time again.

Alkaar commented 1 year ago

How do you know what time reservations open? For example I'm trying to book Casa Cruz but don't know what time to set the snipe for, Thank you.

@shaggy2626 You can flip the log4j file to debug and it will spit out what times are available. Alternatively, you can just snipe every time slot.

shaggy2626 commented 1 year ago

Hi,

Thank you for your response. I guess what I meant to say was how do I know what time to actually start the sniper.

On Tue, Dec 13, 2022 at 10:28 AM Derek Fong @.***> wrote:

How do you know what time reservations open? For example I'm trying to book Casa Cruz but don't know what time to set the snipe for, Thank you.

@shaggy2626 https://github.com/shaggy2626 You can flip the log4j file to debug and it will spit out what times are available. Alternatively, you can just snipe every time slot.

— Reply to this email directly, view it on GitHub https://github.com/Alkaar/resy-booking-bot/issues/41#issuecomment-1348802363, or unsubscribe https://github.com/notifications/unsubscribe-auth/A4W6EMRNZGMV6PXMDEINQ3TWNCI3FANCNFSM6AAAAAAQCSC3EQ . You are receiving this because you were mentioned.Message ID: @.***>

-- Sent from Gmail Mobile

Alkaar commented 1 year ago

Hi, Thank you for your response. I guess what I meant to say was how do I know what time to actually start the sniper.

Ah, that's a bit hard to determine @shaggy2626. Hopefully, they tell either on the resy page or on their main page. If not, you kind of have to sporadically check yourself. Usually, it's on the hour anywhere from 9 AM to 12 PM so there are not that many options to try.

Alkaar commented 1 year ago

Maybe I'll add a tips section to the readme since a lot of people struggle with this. Been busy with other things so I'll come around to it when I have time.

shaggy2626 commented 1 year ago

How do you know what time reservations open? For example I'm trying to book Casa Cruz but don't know what time to set the snipe for, Thank you.

@shaggy2626 You can flip the log4j file to debug and it will spit out what times are available. Alternatively, you can just snipe every time slot.

@Alkaar are the time slots shown in log4j the same as viewing the site as a regular user?

Alkaar commented 1 year ago

@shaggy2626 Not sure what you mean by "the same" but it's the same time slots, just in text form

shaggy2626 commented 1 year ago

@shaggy2626 Not sure what you mean by "the same" but it's the same time slots, just in text form

What I meant to say was, is there any benefit using debug to see the time slots or would it be the same data as if I went to resy.com directly and just typed in the restaurant to see available times, thank you.

Alkaar commented 1 year ago

@shaggy2626 The benefit of debug is you see exactly what time slots that are available that the bot will try to snipe and it's exactly when the reservations become available. If you try it through the website, it will load not only the time slots but images and other code as well. So it is likely that the website will have different time slots than what the bot sees for some of the more popular restaurants.

shaggy2626 commented 1 year ago

@shaggy2626 The benefit of debug is you see exactly what time slots that are available that the bot will try to snipe and it's exactly when the reservations become available. If you try it through the website, it will load not only the time slots but images and other code as well. So it is likely that the website will have different time slots than what the bot sees for some of the more popular restaurants. 13-12-2022-01-47-43

In order to do that do I need to remove the values from resDetails.res-time-types? i see a lot of data in the logs but what should I look for to see what slots are available, thank you once again.

J-clouds commented 1 year ago

Hi Alkaar,

Hope you're well. I set up the bot to snipe different times if the first time doesn't work out but it doesn't seem like the other times are being tested...here's what I see: image

Is there anything obvious that I'm missing?

shaggy2626 commented 1 year ago

e you're well. I set up the bot to snipe different times if the first time doesn't work out

It works for me. If you want to perform the same test I did you can use any restaurant that always has ability and select further out date just so you don't get charged cancellation fees. On the first line put a time you for sure know that the restaurant doesn't offer. For example: the restaurant I selected starts seating at 5pm, I selected for the first 2 options 4:15pm & 4:30pm and my 3rd option was 5pm. Once the bot ran it confirmed the booking at 5pm which was my 3rd time requested. It might not show it on the logs when running the script buts its in fact running down the list of times and which ever one appears available at first the booking will be confirmed.

15-12-2022-08-35-15

J-clouds commented 1 year ago

Good point - thanks! I'm testing it now and realized I think I have an error in general because my bot doesn't work at all. After a lot of troubleshooting, I think the error may be in the venue-id that I'm using...From the network tab, the id is next to _config?venueid, right? (see red circle below)

image

Everything else seems to be correct on my side so that's the last thing I can think of that might be wrong

shaggy2626 commented 1 year ago

Venue ID is correct, on your previous screenshot the log didn't appear to throw out an error. Was wondering why you thought there was an error?

J-clouds commented 1 year ago

Thanks for confirming. Otherwise, I have no idea why else my code isn't working...here's my code for a 6pm test at Nonna Dora's from above:

image

Here's the response where it still couldn't book it: image

Any ideas on where I could be going wrong?

shaggy2626 commented 1 year ago

@J-clouds Did you confirm your using the correct API key? Search the string authorization: ResyAPI api and you should see the key there. 15-12-2022-10-03-02

Then all the way on the right side of console look at the headers x-resy-auth-token: Make sure you token is correct

Do you have a card stored on file?

J-clouds commented 1 year ago

Ah you're totally right. The x-resy-auth-token was wrong. I originally had it right but I think they changed it on me. Has this happened to you before too? If so, I wonder how often this changes...

shaggy2626 commented 1 year ago

Ah you're totally right. The x-resy-auth-token was wrong. I originally had it right but I think they changed it on me. Has this happened to you before too? If so, I wonder how often this changes...

I think 48 hours tops. So far my API key hasn't changed and I have been using the script for about 2 days now. The token changed once and i think it was a bit over 24 hours.

J-clouds commented 1 year ago

Ah so you're saying that the token changes at most once every 48 hours?

shaggy2626 commented 1 year ago

Ah so you're saying that the token changes at most once every 48 hours?

TBH I just started using the code this week and changed my token once. Are you familiar with this? https://github.com/Alkaar/resy-booking-bot/issues/41#issuecomment-1349314471

For example: Restaurant Casa cruz appears to only have reservations in the afternoon. Im trying to see if they have a perm block in their system for evening hours so i dont waste my time trying. I went into debug mode and saw a lot of data but wasnt sure where to look to see if that time slot is ever open.

J-clouds commented 1 year ago

Gosh good question...I wish I could help but you're more advanced than me already. @Alkaar can you please help?

Alkaar commented 1 year ago

There was a bit of back and forth so I'll try to answer all the questions:

i see a lot of data in the logs but what should I look for to see what slots are available, thank you once again.

So resy actually sends back a lot of data, not just the time slots. If you dump it into some online JSON parser, it'll make it a bit more readable. To keep it simple though, look for anything starting with rgs and the rest of that string is the reservation time and table type.

I set up the bot to snipe different times if the first time doesn't work out but it doesn't seem like the other times are being tested...

When sniping your times with what's available, it will go through your priority list of times, one at a time. It will only snipe if there is a time on your priority list as well as a time available. The reason why it seems to not try at all is there is no overlap of your times with the times that are available. That is the reason why the bot error message is Could not find any available reservations. That error is specifically when there is no overlap between your priority list of times with the available times.

Ah you're totally right. The x-resy-auth-token was wrong. I originally had it right but I think they changed it on me. Has this happened to you before too? If so, I wonder how often this changes...

This has happened to me but I don't know the frequency. I've had it last a week or upwards of many weeks. My hunch is it depends on when you login, logout, or reboot your computer but I haven't experimented enough to figure out what triggers it.

shaggy2626 commented 1 year ago

There was a bit of back and forth so I'll try to answer all the questions:

i see a lot of data in the logs but what should I look for to see what slots are available, thank you once again.

So resy actually sends back a lot of data, not just the time slots. If you dump it into some online JSON parser, it'll make it a bit more readable. To keep it simple though, look for anything starting with rgs and the rest of that string is the reservation time and table type.

I set up the bot to snipe different times if the first time doesn't work out but it doesn't seem like the other times are being tested...

When sniping your times with what's available, it will go through your priority list of times, one at a time. It will only snipe if there is a time on your priority list as well as a time available. The reason why it seems to not try at all is there is no overlap of your times with the times that are available. That is the reason why the bot error message is Could not find any available reservations. That error is specifically when there is no overlap between your priority list of times with the available times.

Ah you're totally right. The x-resy-auth-token was wrong. I originally had it right but I think they changed it on me. Has this happened to you before too? If so, I wonder how often this changes...

This has happened to me but I don't know the frequency. I've had it last a week or upwards of many weeks. My hunch is it depends on when you login, logout, or reboot your computer but I haven't experimented enough to figure out what triggers it.

@Alkaar Thank you for the response.

  1. Is there a way for the bot to test the token first once the script is run. For example, I set a snipe for tomorrow morning at 9am. The moment I start the bot we should be able to see if the token is valid or not. Im not sure what the response is from resy if you use an invalid token. If they are passing an error message perhaps we can display that in the logs? Currently the logs just state unsuccessful in sniping however that may not be the case if the token is invalid.

  2. A lot of times ill snipe multiple venues for the same day and then cancel the one I dont want on the resy portal. If both time slots are available and the 1st bot confirms the booking, the 2nd bot will state unsuccessful. The issue is resy displays a pop up stating "you have another restaurant on the same day do you want to cancel or keep" now even though the snipe will locate a reservation on both restaurants it will return back in the logs stating the snipe was unsuccessful. This is prob due to the prompt that needs to be click prior to the booking getting confirmed. I tested this live on resy and was able to proceed with 2 venues for the same day.

Alkaar commented 1 year ago

Sorry for the late response @shaggy2626. Been busy with the holidays but I replied to your questions below.

  1. Is there a way for the bot to test the token first once the script is run. For example, I set a snipe for tomorrow morning at 9am. The moment I start the bot we should be able to see if the token is valid or not. Im not sure what the response is from resy if you use an invalid token. If they are passing an error message perhaps we can display that in the logs? Currently the logs just state unsuccessful in sniping however that may not be the case if the token is invalid.

I've not considered this but that is a good suggestion. I have certainly been burned by this. I don't know if there's a way to validate the token so I'll have to dig into this.

  1. A lot of times ill snipe multiple venues for the same day and then cancel the one I dont want on the resy portal. If both time slots are available and the 1st bot confirms the booking, the 2nd bot will state unsuccessful. The issue is resy displays a pop up stating "you have another restaurant on the same day do you want to cancel or keep" now even though the snipe will locate a reservation on both restaurants it will return back in the logs stating the snipe was unsuccessful. This is prob due to the prompt that needs to be click prior to the booking getting confirmed. I tested this live on resy and was able to proceed with 2 venues for the same day.

I wasn't sure what your question was here. When sniping for two restaurants on the same day, what is the desired behavior you are looking for?

asnebeye commented 1 year ago

[INFO ] 2023-01-21 09:00:13.457-05:00 ResyClient:130 - Headshot! [INFO ] 2023-01-21 09:00:13.457-05:00 ResyClient:131 - (҂‾ ▵‾)︻デ═一 (× _ ×# [INFO ] 2023-01-21 09:00:13.517-05:00 ResyClient:132 - Successfully sniped reservation

Thank you Alkaar!

Alkaar commented 1 year ago

Does anyone have any concerns if I close out this issue? Seems like it was mostly clarifying questions.

ngleich commented 1 year ago

I've not considered this but that is a good suggestion. I have certainly been burned by this. I don't know if there's a way to validate the token so I'll have to dig into this.

This could be move to a new issue if you prefer to close this one, but the login API (http://subzerocbd.info/#using-email-and-password) requires the email/pass without the token and you can retrieve the token from the response. Also the token is a JWT with an expired attribute in Unix time.

One idea could be to check for that expired time on the run of the bot and if expired either alert and don't schedule the task or even generate the login request (adding email/pass on config) and retrieve the new token.


Thx for the bot Alkaar, it's great!

Alkaar commented 1 year ago

Thanks for the reminder! I forgot about this ask.

I didn't want to have e-mail/pass as an entry into the bot because people may not feel comfortable sharing that. Sharing a token that can expire feels "safer" IMO.

I haven't looked into how to check if the token is still valid. @ngleich do you know where I can access the expiration of the token?

Glad the bot has been useful!

ngleich commented 1 year ago

@Alkaar you on the payload part of the JWT they added the expiration day of the session. For example, if you go to https://jwt.io/ and copy the token, you will see on the payload section the expiration day. I don't have scala experience but it seems they offer a few libs to be able to do it https://jwt.io/libraries. Then you can use the timestamp to compare to current day.

Having say that, now I believe that the expiration time of the payload might not be token expiration time, but the user session to keep logged on the page. I just checked my token on the config file from 2 weeks ago, with an expiration time of March 18th (so not expired), and is different from the current auth-token on the page. So this suggestion might be a misleading approach.

Alkaar commented 1 year ago

Thanks for that info @ngleich! Good to know regardless.

I was thinking the best way to check if the token is valid is to access say your profile page and if it loads correctly, your token is valid. If not, then the bot can prompt for a new token. Not sure if there's a cleaner approach. The expiration date would have been nicer if that was possible.

theahura commented 1 year ago

@Alkaar not sure if this is the best place for this question, but since this seems like a general Q&A post I figured I'd add on here.

I'm also trying to get a res at 4 Charles. Already in debug mode. I can't find any output that starts with rgs like you suggest, so I'm not convinced the bot is set up correctly.

I am getting the Could not find any available reservations error, but my config does not specify any time in particular.

I also noticed a Traceback at the top of the debug logs, see below in the log dump.

Any ideas?

Logs:

[INFO ] 2023-06-11 08:59:58.035-04:00 ResyBookingWorkflow:18 - Taking the shot...                                                                                                                                                                                                                                                                                                                                                                              [1925/2078]
[INFO ] 2023-06-11 08:59:58.038-04:00 ResyBookingWorkflow:19 - (҂‾ ▵‾)︻デ═一 (˚▽˚’!)/                            
[INFO ] 2023-06-11 08:59:58.039-04:00 ResyBookingWorkflow:20 - Attempting to snipe reservation                    
[DEBUG] 2023-06-11 08:59:58.267-04:00 InternalLoggerFactory:49 - Using Log4J2 as the default logging framework                                                                                                                       
[DEBUG] 2023-06-11 08:59:58.272-04:00 ResourceLeakDetector:130 - -Dplay.shaded.ahc.io.netty.leakDetection.level: simple                                                                                                              
[DEBUG] 2023-06-11 08:59:58.272-04:00 ResourceLeakDetector:131 - -Dplay.shaded.ahc.io.netty.leakDetection.targetRecords: 4                                                                                                           
[DEBUG] 2023-06-11 08:59:58.276-04:00 ResourceLeakDetectorFactory:195 - Loaded default ResourceLeakDetector: play.shaded.ahc.io.netty.util.ResourceLeakDetector@4d2552aa                                                             
[DEBUG] 2023-06-11 08:59:58.292-04:00 PlatformDependent0:396 - -Dio.netty.noUnsafe: false                         
[DEBUG] 2023-06-11 08:59:58.293-04:00 PlatformDependent0:852 - Java version: 11                                   
[DEBUG] 2023-06-11 08:59:58.294-04:00 PlatformDependent0:121 - sun.misc.Unsafe.theUnsafe: available               
[DEBUG] 2023-06-11 08:59:58.294-04:00 PlatformDependent0:145 - sun.misc.Unsafe.copyMemory: available              
[DEBUG] 2023-06-11 08:59:58.295-04:00 PlatformDependent0:183 - java.nio.Buffer.address: available                 
[DEBUG] 2023-06-11 08:59:58.296-04:00 PlatformDependent0:253 - direct buffer constructor: unavailable                                                                                                                                
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled                                  
        at play.shaded.ahc.io.netty.util.internal.ReflectionUtil.trySetAccessible(ReflectionUtil.java:31) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent0$4.run(PlatformDependent0.java:225) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                  
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]                                      
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:219) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                               
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:273) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                  
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:109) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:218) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:197) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:179) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:163) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient.newNettyTimer(DefaultAsyncHttpClient.java:97) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                      
        at play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient.<init>(DefaultAsyncHttpClient.java:87) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                             
        at play.api.libs.ws.ahc.StandaloneAhcWSClient$.apply(StandaloneAhcWSClient.scala:221) ~[play-ahc-ws-standalone_2.13-2.1.10.jar:2.8.18]                                                                                       
        at play.api.libs.ws.ahc.AhcWSClient$.apply(AhcWSClient.scala:70) ~[play-ahc-ws_2.13-2.8.18.jar:2.8.18]                                                                                                                       
        at com.resy.ResyApi$.<clinit>(ResyApi.scala:78) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                                   
        at com.resy.ResyApi.getReservations(ResyApi.scala:34) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                             
        at com.resy.ResyClient.$anonfun$retryFindReservations$1(ResyClient.scala:154) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                     
        at scala.util.Try$.apply(Try.scala:210) ~[scala-library-2.13.8.jar:?]                                     
        at com.resy.ResyClient.retryFindReservations(ResyClient.scala:152) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                
        at com.resy.ResyClient.findReservations(ResyClient.scala:50) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                      
        at com.resy.ResyBookingWorkflow.runnable(ResyBookingWorkflow.scala:22) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                            
        at com.resy.ResyBookingWorkflow.run(ResyBookingWorkflow.scala:14) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                 
        at com.resy.ResyBookingBot$.$anonfun$main$4(ResyBookingBot.scala:51) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                              
        at akka.actor.Scheduler$$anon$7.run(Scheduler.scala:479) ~[akka-actor_2.13-2.6.20.jar:2.6.20]                                                                                                                                
        at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426) ~[?:?]                                                                                                                               
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) ~[?:?]                                 
        at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) ~[?:?]                
        at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) ~[?:?]                                  
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) ~[?:?]                             
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) ~[?:?]                    
[DEBUG] 2023-06-11 08:59:58.304-04:00 PlatformDependent0:314 - java.nio.Bits.unaligned: available, true                                                                                                                              
[DEBUG] 2023-06-11 08:59:58.305-04:00 PlatformDependent0:373 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable                                                                                                 
java.lang.IllegalAccessException: class play.shaded.ahc.io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @47585be
        at jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361) ~[?:?]                  
        at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591) ~[?:?]                       
        at java.lang.reflect.Method.invoke(Method.java:558) ~[?:?]                                                
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:335) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                  
        at java.security.AccessController.doPrivileged(Native Method) ~[?:?]                                      
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:326) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                               
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:273) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                  
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:109) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:218) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:197) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:179) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:163) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                                              
        at play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient.newNettyTimer(DefaultAsyncHttpClient.java:97) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                      
        at play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient.<init>(DefaultAsyncHttpClient.java:87) ~[shaded-asynchttpclient-2.1.10.jar:2.1.10]                                                                             
        at play.api.libs.ws.ahc.StandaloneAhcWSClient$.apply(StandaloneAhcWSClient.scala:221) ~[play-ahc-ws-standalone_2.13-2.1.10.jar:2.8.18]                                                                                       
        at play.api.libs.ws.ahc.AhcWSClient$.apply(AhcWSClient.scala:70) ~[play-ahc-ws_2.13-2.8.18.jar:2.8.18]                                                                                                                       
        at com.resy.ResyApi$.<clinit>(ResyApi.scala:78) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                                   
        at com.resy.ResyApi.getReservations(ResyApi.scala:34) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                             
        at com.resy.ResyClient.$anonfun$retryFindReservations$1(ResyClient.scala:154) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                     
        at scala.util.Try$.apply(Try.scala:210) ~[scala-library-2.13.8.jar:?]                                     
        at com.resy.ResyClient.retryFindReservations(ResyClient.scala:152) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                
        at com.resy.ResyClient.findReservations(ResyClient.scala:50) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                      
        at com.resy.ResyBookingWorkflow.runnable(ResyBookingWorkflow.scala:22) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                            
        at com.resy.ResyBookingWorkflow.run(ResyBookingWorkflow.scala:14) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                                 
        at com.resy.ResyBookingBot$.$anonfun$main$4(ResyBookingBot.scala:51) ~[resy-booking-bot_2.13-3.1.2+1-df91adc7+20230611-0019.jar:3.1.2+1-df91adc7+20230611-0019]                                                              
        at akka.actor.Scheduler$$anon$7.run(Scheduler.scala:479) ~[akka-actor_2.13-2.6.20.jar:2.6.20]                                                                                                                                
        at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426) ~[?:?]                                                                                                                               
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) ~[?:?]                                 
        at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) ~[?:?]                
        at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) ~[?:?]                                  
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) ~[?:?]                             
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) ~[?:?]                    
[DEBUG] 2023-06-11 08:59:58.307-04:00 PlatformDependent0:386 - java.nio.DirectByteBuffer.<init>(long, int): unavailable                                                                                                              
[DEBUG] 2023-06-11 08:59:58.307-04:00 PlatformDependent:1030 - sun.misc.Unsafe: available                         
[DEBUG] 2023-06-11 08:59:58.308-04:00 PlatformDependent:1130 - maxDirectMemory: 1073741824 bytes (maybe)                                                                                                                             
[DEBUG] 2023-06-11 08:59:58.308-04:00 PlatformDependent:1149 - -Dio.netty.tmpdir: /tmp (java.io.tmpdir)                                                                                                                              
[DEBUG] 2023-06-11 08:59:58.309-04:00 PlatformDependent:1228 - -Dio.netty.bitMode: 64 (sun.arch.data.model)                                                                                                                          
[DEBUG] 2023-06-11 08:59:58.310-04:00 PlatformDependent:174 - -Dio.netty.maxDirectMemory: -1 bytes                
[DEBUG] 2023-06-11 08:59:58.310-04:00 PlatformDependent:181 - -Dio.netty.uninitializedArrayAllocationThreshold: -1                                                                                                                   
[DEBUG] 2023-06-11 08:59:58.311-04:00 CleanerJava9:71 - java.nio.ByteBuffer.cleaner(): available                  
[DEBUG] 2023-06-11 08:59:58.312-04:00 PlatformDependent:201 - -Dio.netty.noPreferDirect: false                    
[DEBUG] 2023-06-11 08:59:58.319-04:00 PlatformDependent:891 - org.jctools-core.MpscChunkedArrayQueue: available                                                                                                                      
[DEBUG] 2023-06-11 08:59:58.346-04:00 InternalThreadLocalMap:54 - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024                                                                                                          
[DEBUG] 2023-06-11 08:59:58.346-04:00 InternalThreadLocalMap:57 - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096                                                                                                              
[DEBUG] 2023-06-11 08:59:58.352-04:00 MultithreadEventLoopGroup:44 - -Dio.netty.eventLoopThreads: 16              
[DEBUG] 2023-06-11 08:59:58.360-04:00 NioEventLoop:106 - -Dio.netty.noKeySetOptimization: false                   
[DEBUG] 2023-06-11 08:59:58.361-04:00 NioEventLoop:107 - -Dio.netty.selectorAutoRebuildThreshold: 512                                                                                                                                
[DEBUG] 2023-06-11 08:59:58.386-04:00 PooledByteBufAllocator:142 - -Dio.netty.allocator.numHeapArenas: 10                                                                                                                            
[DEBUG] 2023-06-11 08:59:58.386-04:00 PooledByteBufAllocator:143 - -Dio.netty.allocator.numDirectArenas: 10                                                                                                                          
[DEBUG] 2023-06-11 08:59:58.387-04:00 PooledByteBufAllocator:145 - -Dio.netty.allocator.pageSize: 8192                                                                                                                               
[DEBUG] 2023-06-11 08:59:58.387-04:00 PooledByteBufAllocator:150 - -Dio.netty.allocator.maxOrder: 11              
[DEBUG] 2023-06-11 08:59:58.388-04:00 PooledByteBufAllocator:154 - -Dio.netty.allocator.chunkSize: 16777216                                                                                                                          
[DEBUG] 2023-06-11 08:59:58.388-04:00 PooledByteBufAllocator:155 - -Dio.netty.allocator.tinyCacheSize: 512                                                                                                                           
[DEBUG] 2023-06-11 08:59:58.388-04:00 PooledByteBufAllocator:156 - -Dio.netty.allocator.smallCacheSize: 256                                                                                                                          
[DEBUG] 2023-06-11 08:59:58.389-04:00 PooledByteBufAllocator:157 - -Dio.netty.allocator.normalCacheSize: 64                                                                                                                          
[DEBUG] 2023-06-11 08:59:58.389-04:00 PooledByteBufAllocator:158 - -Dio.netty.allocator.maxCachedBufferCapacity: 32768                                                                                                               
[DEBUG] 2023-06-11 08:59:58.389-04:00 PooledByteBufAllocator:159 - -Dio.netty.allocator.cacheTrimInterval: 8192                                                                                                                      
[DEBUG] 2023-06-11 08:59:58.390-04:00 PooledByteBufAllocator:160 - -Dio.netty.allocator.cacheTrimIntervalMillis: 0                                                                                                                   
[DEBUG] 2023-06-11 08:59:58.390-04:00 PooledByteBufAllocator:161 - -Dio.netty.allocator.useCacheForAllThreads: true                                                                                                                  
[DEBUG] 2023-06-11 08:59:58.390-04:00 PooledByteBufAllocator:162 - -Dio.netty.allocator.maxCachedByteBuffersPerChunk: 1023                                                                                                           
[DEBUG] 2023-06-11 08:59:58.397-04:00 ByteBufUtil:86 - -Dio.netty.allocator.type: pooled                          
[DEBUG] 2023-06-11 08:59:58.397-04:00 ByteBufUtil:95 - -Dio.netty.threadLocalDirectBufferSize: 0                                                                                                                                                                                                                                                                                                                                                               [1815/2078]
[DEBUG] 2023-06-11 08:59:58.397-04:00 ByteBufUtil:98 - -Dio.netty.maxThreadLocalCharBufferSize: 16384                                                                                                                                                                                                                                                                                                                                                                     
[INFO ] 2023-06-11 08:59:58.420-04:00 ResyApi$:88 - URL Request: https://api.resy.com/4/find?venue_id=834&party_size=4&long=0&day=2021-07-01&lat=0&                                                                                                                                                                                                                                                                                                                       
[DEBUG] 2023-06-11 08:59:58.528-04:00 DefaultChannelId:79 - -Dio.netty.processId: 211506 (auto-detected)                                                                                                                                                                                                                                                                                                                                                                  
[DEBUG] 2023-06-11 08:59:58.530-04:00 NetUtil:139 - -Djava.net.preferIPv4Stack: false                                                                                                                                                                                                                                                                                                                                                                                     
[DEBUG] 2023-06-11 08:59:58.530-04:00 NetUtil:140 - -Djava.net.preferIPv6Addresses: false                                                                                                                                                                                                                                                                                                                                                                                 
[DEBUG] 2023-06-11 08:59:58.531-04:00 NetUtil:224 - Loopback interface: lo (lo, 0:0:0:0:0:0:0:1%lo)                                                                                                                                                                                                                                                                                                                                                                       
[DEBUG] 2023-06-11 08:59:58.532-04:00 NetUtil:271 - /proc/sys/net/core/somaxconn: 4096                                                                                                                                                                                                                                                                                                                                                                                    
[DEBUG] 2023-06-11 08:59:58.533-04:00 DefaultChannelId:101 - -Dio.netty.machineId: 50:2f:9b:ff:fe:d4:8a:f0 (auto-detected)                                                                                                                                                                                                                                                                                                                                                
[DEBUG] 2023-06-11 08:59:58.567-04:00 AbstractByteBuf:63 - -Dplay.shaded.ahc.io.netty.buffer.checkAccessible: true                                                                                                                                                                                                                                                                                                                                                        
[DEBUG] 2023-06-11 08:59:58.568-04:00 AbstractByteBuf:64 - -Dplay.shaded.ahc.io.netty.buffer.checkBounds: true                                                                                                                                                                                                                                                                                                                                                            
[DEBUG] 2023-06-11 08:59:58.568-04:00 ResourceLeakDetectorFactory:195 - Loaded default ResourceLeakDetector: play.shaded.ahc.io.netty.util.ResourceLeakDetector@662c41ba                                                                                                                                                                                                                                                                                                  
[DEBUG] 2023-06-11 08:59:58.641-04:00 Recycler:97 - -Dio.netty.recycler.maxCapacityPerThread: 4096                                                                                                                                                                                                                                                                                                                                                                        
[DEBUG] 2023-06-11 08:59:58.642-04:00 Recycler:98 - -Dio.netty.recycler.maxSharedCapacityFactor: 2                                                                                                                                                                                                                                                                                                                                                                        
[DEBUG] 2023-06-11 08:59:58.642-04:00 Recycler:99 - -Dio.netty.recycler.linkCapacity: 16                                                                                                                                                                                                                                                                                                                                                                                  
[DEBUG] 2023-06-11 08:59:58.642-04:00 Recycler:100 - -Dio.netty.recycler.ratio: 8                                                                                                                                                                                                                                                                                                                                                                                         
[DEBUG] 2023-06-11 08:59:58.759-04:00 SslHandler:1743 - [id: 0x5482f18b, L:/192.168.1.174:33210 - R:api.resy.com/108.138.106.92:443] HANDSHAKEN: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256                                                                                                                                                                                                                                                                                    
[INFO ] 2023-06-11 08:59:59.149-04:00 ResyClient:158 - URL Response: {"query": {"day": "2021-07-01", "party_size": 4}, "bookmark": null, "results": {"venues": [{"venue": {"id": {"resy": 834}, "venue_group": {"id": 624, "name": "Hogsalt Admin Group", "venues": [4242, 4244, 4408, 4411, 4412, 4473, 5769, 7294, 10294, 54602, 60058]}, "name": "4 Charles Prime Rib", "type": "Steakhouse", "url_slug": "4-charles-prime-rib", "price_range": 3, "average_bill_size":
 83.0, "currency_symbol": "$", "hospitality_included": 0, "resy_select": 0, "is_gdc": 0, "is_global_dining_access": false, "is_global_dining_access_only": false, "requires_reservation_transfers": 0, "is_gns": 0, "transaction_processor": "stripe", "hide_allergy_question": false, "hide_occasion_question": false, "hide_special_request_question": false, "gda_concierge_booking": false, "tax_included": false, "rating": 4.93117, "total_ratings": 21109, "invento
ry": {"type": {"id": 2}}, "reopen": {"date": "2020-08-25"}, "location": {"time_zone": "EST5EDT", "neighborhood": "West Village", "geo": {"lat": 40.735144, "lon": -74.000652}, "code": "ny", "name": "New York", "url_slug": null}, "travel_time": {"distance": 5391.248738710361}, "source": {"name": null, "logo": null, "terms_of_service": null, "privacy_policy": null}, "service_types": {}, "top": false, "ticket": {"average": 83.0, "average_str": "$83"}, "curre
ncy": {"symbol": "$", "code": "USD"}, "is_rga": false, "is_rga_only": false, "default_template": "829957", "responsive_images": {"originals": {"40417f593630d9082ffe353640349e13d715e0ab": {"url": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg"}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"url": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg"}, "8c58ed63bbdfdda229fb328a93cba65296594354":
 {"url": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg"}}, "urls": {"40417f593630d9082ffe353640349e13d715e0ab": {"1:1": {"200": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "1600": 
"https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/40417f59
3630d9082ffe353640349e13d715e0ab/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"1:1": {"200": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7
bad018ba586f022f0833f234bb/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "1600": "https
://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"1:1": {"200": "
https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "urls_by_resolution": {"40417f593630d9082ffe353640349e13d715e0ab": {"200": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e
13d715e0ab/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "4:3": "https://image
.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349
e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"200": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f02
2f0833f234bb/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600", "4:3": "https://
image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"200": {"1:1": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "400": {"4:3": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400", "16:9": "https
://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "file_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "aspect_ratios": {"1:1": {"200": "200x200", "400": "400x400", "800": "800x800", "1600": "1600x1600"}, "4:3": {"400": "400x300", "800": "800x600", "1600": "1600x1200"}, "16:9": {"400": "400x225", "800": "800x450", "1600": 
"1600x900"}}}, "notify_options": [], "favorite": false, "waitlist": {"available": 0, "label": "Join Wait List", "current": null}, "supports_pickups": 0, "collections": [{"id": 883, "type_id": 1, "file_name": "winter", "image": "https://s3.amazonaws.com/resy.com/images/lists/winter.svg", "name": "New York\u2019s Essential Cozy Locales", "short_name": "Cozy Locales", "description": "Your new favorite apr\u00e8s-ski (sans the ski) locales \u2014 fireplace, 
snug corners, and heart-warming fare included."}, {"id": 1025, "type_id": 1, "file_name": "holiday", "image": "https://s3.amazonaws.com/resy.com/images/lists/holiday.svg", "name": "Where to Dine Out and Shop Small", "short_name": "Dine Small", "description": "It's time to revisit the restaurants we love. Shop Small\u00ae by visiting independent restaurants and small businesses you love. Featuring qualifying American Express-accepting restaurants."}, {"id
": 1089, "type_id": 1, "file_name": "chef-picks", "image": "https://s3.amazonaws.com/resy.com/images/lists/chef-picks.svg", "name": "Splurge-Worthy Dining in New York", "short_name": "Splurge Worthy", "description": "From blowout meals to special occasion dining, here are our favorite restaurants worth the price tag."}], "content": [{"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features on
e of the city\u2019s best burgers.", "display": {"type": "text"}, "icon": {"url": "https://s3.amazonaws.com/resy.com/images/icons/heart.svg"}, "locale": {"language": "en-us"}, "name": "why_we_like_it", "title": null}], "allow_bypass_payment_method": 1, "events": []}, "templates": {"829957": {"is_paid": false, "venue_share": null, "restriction_id": null, "payment_structure": null, "cancellation_fee": null, "secs_cancel_cut_off": null, "time_cancel_cut_off
": null, "secs_change_cut_off": null, "time_change_cut_off": null, "large_party_size_cancel": null, "large_party_cancellation_fee": null, "large_party_secs_cancel_cut_off": null, "large_party_time_cancel_cut_off": null, "large_party_secs_change_cut_off": null, "large_party_time_change_cut_off": null, "deposit_fee": null, "service_charge": null, "service_charge_options": [], "images": ["https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d7
15e0ab/jpg/640x360", "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/640x360", "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/640x360"], "raw_image_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "image_dimensions": [[1763, 1669], [1764, 1672], [640, 360]], "is_default": 1, "is_event": 0, "is_pic
kup": 0, "pickup_highlight": 0, "venue_id": 834, "reservation_config": {"badge": null, "type": "", "secs_off_market": null, "time_off_market": null}, "turn_times": [{"secs_amount": 5400, "size": {"max": 1, "min": 1}}, {"secs_amount": 5400, "size": {"max": 2, "min": 2}}, {"secs_amount": 5400, "size": {"max": 3, "min": 3}}, {"secs_amount": 5400, "size": {"max": 4, "min": 4}}, {"secs_amount": 5400, "size": {"max": null, "min": 5}}], "display_config": {"colo
r": {"background": null, "font": null}}, "content": {"en-us": {"about": {"attribution": null, "body": "4 Charles is an intimate supper club tucked away in the charming West Village. With crystal chandeliers, plush leather seating and paintings lining its dark wood walls, this late-night dining den winks at a lost era.  We welcome  friends, family, and regulars for gorgeous cuts of prime rib, fresh seafood, and strong drinks. We are currently accepting re
servations for indoor and outdoor dining. ", "title": null}, "need_to_know": {"attribution": null, "body": "Reservations are available up to 21 days in advance, with each new date becoming available at 9 AM.\n\nA $5 per person reservation fee will be added to all reservations. This is to secure your seats with us and does not go towards your final bill. Holiday fees may vary. Please note that we do also politely ask that reservations are booked true to s
ize including any children. Your party size is considered final once the reservation is booked, and decreasing your party size at any time is not permitted. Should you arrive with less guests, we will apply a $50 per person guest change fee. This fee is applied for all reductions in party size, for any reason. It will be added to the final check. Thank you for your consideration!", "title": "Need to Know"}, "tagline": {"attribution": null, "body": "Prime
 Rib, Fresh Seafood, Strong Drinks.", "title": null}, "why_we_like_it": {"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features one of the city\u2019s best burgers.", "title": null}}}, "id": 829957, "menu": {"en-us": ["Shrimp Cocktail (cocktail sauce, dijonnaise)", "American Cheeseburger", "Dry Aged Bone-In Ribeye Steak (22 oz, b\u00e9arnaise sauce, steak salt)", "Roast Prime Rib of Beef (1
2 hours slow roasted, salt crusted, USDA prime rib of beef with natural beef jus & horseradish cream)"]}, "name": "UPDATED_DEFAULT_TEMPLATE", "item_ids": [], "menu_ids": []}}, "slots": [], "notifies": [], "pickups": {"slots": [], "service_types": {}}}], "meta": {"offset": 1, "limit": null}}}
[INFO ] 2023-06-11 08:59:59.294-04:00 ResyApi$:88 - URL Request: https://api.resy.com/4/find?venue_id=834&party_size=4&long=0&day=2021-07-01&lat=0&                                                                                  
[INFO ] 2023-06-11 08:59:59.682-04:00 ResyClient:158 - URL Response: {"query": {"day": "2021-07-01", "party_size": 4}, "bookmark": null, "results": {"venues": [{"venue": {"id": {"resy": 834}, "venue_group": {"id": 624, "name": "Hogsalt Admin Group", "venues": [4242, 4244, 4408, 4411, 4412, 4473, 5769, 7294, 10294, 54602, 60058]}, "name": "4 Charles Prime Rib", "type": "Steakhouse", "url_slug": "4-charles-prime-rib", "price_range": 3, "average_bill_size":
 83.0, "currency_symbol": "$", "hospitality_included": 0, "resy_select": 0, "is_gdc": 0, "is_global_dining_access": false, "is_global_dining_access_only": false, "requires_reservation_transfers": 0, "is_gns": 0, "transaction_processor": "stripe", "hide_allergy_question": false, "hide_occasion_question": false, "hide_special_request_question": false, "gda_concierge_booking": false, "tax_included": false, "rating": 4.93117, "total_ratings": 21109, "invento
ry": {"type": {"id": 2}}, "reopen": {"date": "2020-08-25"}, "location": {"time_zone": "EST5EDT", "neighborhood": "West Village", "geo": {"lat": 40.735144, "lon": -74.000652}, "code": "ny", "name": "New York", "url_slug": null}, "travel_time": {"distance": 5391.248738710361}, "source": {"name": null, "logo": null, "terms_of_service": null, "privacy_policy": null}, "service_types": {}, "top": false, "ticket": {"average": 83.0, "average_str": "$83"}, "curre
ncy": {"symbol": "$", "code": "USD"}, "is_rga": false, "is_rga_only": false, "default_template": "829957", "responsive_images": {"originals": {"40417f593630d9082ffe353640349e13d715e0ab": {"url": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg"}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"url": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg"}, "8c58ed63bbdfdda229fb328a93cba65296594354":
 {"url": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg"}}, "urls": {"40417f593630d9082ffe353640349e13d715e0ab": {"1:1": {"200": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "1600": 
"https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/40417f59
3630d9082ffe353640349e13d715e0ab/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"1:1": {"200": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7
bad018ba586f022f0833f234bb/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "1600": "https
://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"1:1": {"200": "
https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "urls_by_resolution": {"40417f593630d9082ffe353640349e13d715e0ab": {"200": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e
13d715e0ab/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "4:3": "https://image
.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349
e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"200": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f02
2f0833f234bb/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600", "4:3": "https://
image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"200": {"1:1": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "400": {"4:3": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400", "16:9": "https
://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "file_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "aspect_ratios": {"1:1": {"200": "200x200", "400": "400x400", "800": "800x800", "1600": "1600x1600"}, "4:3": {"400": "400x300", "800": "800x600", "1600": "1600x1200"}, "16:9": {"400": "400x225", "800": "800x450", "1600": 
"1600x900"}}}, "notify_options": [], "favorite": false, "waitlist": {"available": 0, "label": "Join Wait List", "current": null}, "supports_pickups": 0, "collections": [{"id": 883, "type_id": 1, "file_name": "winter", "image": "https://s3.amazonaws.com/resy.com/images/lists/winter.svg", "name": "New York\u2019s Essential Cozy Locales", "short_name": "Cozy Locales", "description": "Your new favorite apr\u00e8s-ski (sans the ski) locales \u2014 fireplace, 
snug corners, and heart-warming fare included."}, {"id": 1025, "type_id": 1, "file_name": "holiday", "image": "https://s3.amazonaws.com/resy.com/images/lists/holiday.svg", "name": "Where to Dine Out and Shop Small", "short_name": "Dine Small", "description": "It's time to revisit the restaurants we love. Shop Small\u00ae by visiting independent restaurants and small businesses you love. Featuring qualifying American Express-accepting restaurants."}, {"id
": 1089, "type_id": 1, "file_name": "chef-picks", "image": "https://s3.amazonaws.com/resy.com/images/lists/chef-picks.svg", "name": "Splurge-Worthy Dining in New York", "short_name": "Splurge Worthy", "description": "From blowout meals to special occasion dining, here are our favorite restaurants worth the price tag."}], "content": [{"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features on
e of the city\u2019s best burgers.", "display": {"type": "text"}, "icon": {"url": "https://s3.amazonaws.com/resy.com/images/icons/heart.svg"}, "locale": {"language": "en-us"}, "name": "why_we_like_it", "title": null}], "allow_bypass_payment_method": 1, "events": []}, "templates": {"829957": {"is_paid": false, "venue_share": null, "restriction_id": null, "payment_structure": null, "cancellation_fee": null, "secs_cancel_cut_off": null, "time_cancel_cut_off
": null, "secs_change_cut_off": null, "time_change_cut_off": null, "large_party_size_cancel": null, "large_party_cancellation_fee": null, "large_party_secs_cancel_cut_off": null, "large_party_time_cancel_cut_off": null, "large_party_secs_change_cut_off": null, "large_party_time_change_cut_off": null, "deposit_fee": null, "service_charge": null, "service_charge_options": [], "images": ["https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d7
15e0ab/jpg/640x360", "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/640x360", "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/640x360"], "raw_image_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "image_dimensions": [[1763, 1669], [1764, 1672], [640, 360]], "is_default": 1, "is_event": 0, "is_pic
kup": 0, "pickup_highlight": 0, "venue_id": 834, "reservation_config": {"badge": null, "type": "", "secs_off_market": null, "time_off_market": null}, "turn_times": [{"secs_amount": 5400, "size": {"max": 1, "min": 1}}, {"secs_amount": 5400, "size": {"max": 2, "min": 2}}, {"secs_amount": 5400, "size": {"max": 3, "min": 3}}, {"secs_amount": 5400, "size": {"max": 4, "min": 4}}, {"secs_amount": 5400, "size": {"max": null, "min": 5}}], "display_config": {"colo
r": {"background": null, "font": null}}, "content": {"en-us": {"about": {"attribution": null, "body": "4 Charles is an intimate supper club tucked away in the charming West Village. With crystal chandeliers, plush leather seating and paintings lining its dark wood walls, this late-night dining den winks at a lost era.  We welcome  friends, family, and regulars for gorgeous cuts of prime rib, fresh seafood, and strong drinks. We are currently accepting re
servations for indoor and outdoor dining. ", "title": null}, "need_to_know": {"attribution": null, "body": "Reservations are available up to 21 days in advance, with each new date becoming available at 9 AM.\n\nA $5 per person reservation fee will be added to all reservations. This is to secure your seats with us and does not go towards your final bill. Holiday fees may vary. Please note that we do also politely ask that reservations are booked true to s
ize including any children. Your party size is considered final once the reservation is booked, and decreasing your party size at any time is not permitted. Should you arrive with less guests, we will apply a $50 per person guest change fee. This fee is applied for all reductions in party size, for any reason. It will be added to the final check. Thank you for your consideration!", "title": "Need to Know"}, "tagline": {"attribution": null, "body": "Prime
 Rib, Fresh Seafood, Strong Drinks.", "title": null}, "why_we_like_it": {"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features one of the city\u2019s best burgers.", "title": null}}}, "id": 829957, "menu": {"en-us": ["Shrimp Cocktail (cocktail sauce, dijonnaise)", "American Cheeseburger", "Dry Aged Bone-In Ribeye Steak (22 oz, b\u00e9arnaise sauce, steak salt)", "Roast Prime Rib of Beef (1
2 hours slow roasted, salt crusted, USDA prime rib of beef with natural beef jus & horseradish cream)"]}, "name": "UPDATED_DEFAULT_TEMPLATE", "item_ids": [], "menu_ids": []}}, "slots": [], "notifies": [], "pickups": {"slots": [], "service_types": {}}}], "meta": {"offset": 1, "limit": null}}}
[INFO ] 2023-06-11 08:59:59.687-04:00 ResyApi$:88 - URL Request: https://api.resy.com/4/find?venue_id=834&party_size=4&long=0&day=2021-07-01&lat=0&                                                                                  
[INFO ] 2023-06-11 08:59:59.996-04:00 ResyClient:158 - URL Response: {"query": {"day": "2021-07-01", "party_size": 4}, "bookmark": null, "results": {"venues": [{"venue": {"id": {"resy": 834}, "venue_group": {"id": 624, "name": "Hogsalt Admin Group", "venues": [4242, 4244, 4408, 4411, 4412, 4473, 5769, 7294, 10294, 54602, 60058]}, "name": "4 Charles Prime Rib", "type": "Steakhouse", "url_slug": "4-charles-prime-rib", "price_range": 3, "average_bill_size":
 83.0, "currency_symbol": "$", "hospitality_included": 0, "resy_select": 0, "is_gdc": 0, "is_global_dining_access": false, "is_global_dining_access_only": false, "requires_reservation_transfers": 0, "is_gns": 0, "transaction_processor": "stripe", "hide_allergy_question": false, "hide_occasion_question": false, "hide_special_request_question": false, "gda_concierge_booking": false, "tax_included": false, "rating": 4.93117, "total_ratings": 21109, "invento
ry": {"type": {"id": 2}}, "reopen": {"date": "2020-08-25"}, "location": {"time_zone": "EST5EDT", "neighborhood": "West Village", "geo": {"lat": 40.735144, "lon": -74.000652}, "code": "ny", "name": "New York", "url_slug": null}, "travel_time": {"distance": 5391.248738710361}, "source": {"name": null, "logo": null, "terms_of_service": null, "privacy_policy": null}, "service_types": {}, "top": false, "ticket": {"average": 83.0, "average_str": "$83"}, "curre
ncy": {"symbol": "$", "code": "USD"}, "is_rga": false, "is_rga_only": false, "default_template": "829957", "responsive_images": {"originals": {"40417f593630d9082ffe353640349e13d715e0ab": {"url": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg"}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"url": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg"}, "8c58ed63bbdfdda229fb328a93cba65296594354":
 {"url": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg"}}, "urls": {"40417f593630d9082ffe353640349e13d715e0ab": {"1:1": {"200": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "1600": 
"https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/40417f59
3630d9082ffe353640349e13d715e0ab/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"1:1": {"200": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7
bad018ba586f022f0833f234bb/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "1600": "https
://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"1:1": {"200": "
https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "urls_by_resolution": {"40417f593630d9082ffe353640349e13d715e0ab": {"200": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e
13d715e0ab/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "4:3": "https://image
.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349
e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"200": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f02
2f0833f234bb/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600", "4:3": "https://
image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"200": {"1:1": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "400": {"4:3": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400", "16:9": "https
://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "file_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "aspect_ratios": {"1:1": {"200": "200x200", "400": "400x400", "800": "800x800", "1600": "1600x1600"}, "4:3": {"400": "400x300", "800": "800x600", "1600": "1600x1200"}, "16:9": {"400": "400x225", "800": "800x450", "1600": 
"1600x900"}}}, "notify_options": [], "favorite": false, "waitlist": {"available": 0, "label": "Join Wait List", "current": null}, "supports_pickups": 0, "collections": [{"id": 883, "type_id": 1, "file_name": "winter", "image": "https://s3.amazonaws.com/resy.com/images/lists/winter.svg", "name": "New York\u2019s Essential Cozy Locales", "short_name": "Cozy Locales", "description": "Your new favorite apr\u00e8s-ski (sans the ski) locales \u2014 fireplace, 
snug corners, and heart-warming fare included."}, {"id": 1025, "type_id": 1, "file_name": "holiday", "image": "https://s3.amazonaws.com/resy.com/images/lists/holiday.svg", "name": "Where to Dine Out and Shop Small", "short_name": "Dine Small", "description": "It's time to revisit the restaurants we love. Shop Small\u00ae by visiting independent restaurants and small businesses you love. Featuring qualifying American Express-accepting restaurants."}, {"id
": 1089, "type_id": 1, "file_name": "chef-picks", "image": "https://s3.amazonaws.com/resy.com/images/lists/chef-picks.svg", "name": "Splurge-Worthy Dining in New York", "short_name": "Splurge Worthy", "description": "From blowout meals to special occasion dining, here are our favorite restaurants worth the price tag."}], "content": [{"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features on
e of the city\u2019s best burgers.", "display": {"type": "text"}, "icon": {"url": "https://s3.amazonaws.com/resy.com/images/icons/heart.svg"}, "locale": {"language": "en-us"}, "name": "why_we_like_it", "title": null}], "allow_bypass_payment_method": 1, "events": []}, "templates": {"829957": {"is_paid": false, "venue_share": null, "restriction_id": null, "payment_structure": null, "cancellation_fee": null, "secs_cancel_cut_off": null, "time_cancel_cut_off
": null, "secs_change_cut_off": null, "time_change_cut_off": null, "large_party_size_cancel": null, "large_party_cancellation_fee": null, "large_party_secs_cancel_cut_off": null, "large_party_time_cancel_cut_off": null, "large_party_secs_change_cut_off": null, "large_party_time_change_cut_off": null, "deposit_fee": null, "service_charge": null, "service_charge_options": [], "images": ["https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d7
15e0ab/jpg/640x360", "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/640x360", "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/640x360"], "raw_image_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "image_dimensions": [[1763, 1669], [1764, 1672], [640, 360]], "is_default": 1, "is_event": 0, "is_pic
kup": 0, "pickup_highlight": 0, "venue_id": 834, "reservation_config": {"badge": null, "type": "", "secs_off_market": null, "time_off_market": null}, "turn_times": [{"secs_amount": 5400, "size": {"max": 1, "min": 1}}, {"secs_amount": 5400, "size": {"max": 2, "min": 2}}, {"secs_amount": 5400, "size": {"max": 3, "min": 3}}, {"secs_amount": 5400, "size": {"max": 4, "min": 4}}, {"secs_amount": 5400, "size": {"max": null, "min": 5}}], "display_config": {"colo
r": {"background": null, "font": null}}, "content": {"en-us": {"about": {"attribution": null, "body": "4 Charles is an intimate supper club tucked away in the charming West Village. With crystal chandeliers, plush leather seating and paintings lining its dark wood walls, this late-night dining den winks at a lost era.  We welcome  friends, family, and regulars for gorgeous cuts of prime rib, fresh seafood, and strong drinks. We are currently accepting re
servations for indoor and outdoor dining. ", "title": null}, "need_to_know": {"attribution": null, "body": "Reservations are available up to 21 days in advance, with each new date becoming available at 9 AM.\n\nA $5 per person reservation fee will be added to all reservations. This is to secure your seats with us and does not go towards your final bill. Holiday fees may vary. Please note that we do also politely ask that reservations are booked true to s
ize including any children. Your party size is considered final once the reservation is booked, and decreasing your party size at any time is not permitted. Should you arrive with less guests, we will apply a $50 per person guest change fee. This fee is applied for all reductions in party size, for any reason. It will be added to the final check. Thank you for your consideration!", "title": "Need to Know"}, "tagline": {"attribution": null, "body": "Prime
 Rib, Fresh Seafood, Strong Drinks.", "title": null}, "why_we_like_it": {"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features one of the city\u2019s best burgers.", "title": null}}}, "id": 829957, "menu": {"en-us": ["Shrimp Cocktail (cocktail sauce, dijonnaise)", "American Cheeseburger", "Dry Aged Bone-In Ribeye Steak (22 oz, b\u00e9arnaise sauce, steak salt)", "Roast Prime Rib of Beef (1
2 hours slow roasted, salt crusted, USDA prime rib of beef with natural beef jus & horseradish cream)"]}, "name": "UPDATED_DEFAULT_TEMPLATE", "item_ids": [], "menu_ids": []}}, "slots": [], "notifies": [], "pickups": {"slots": [], "service_types": {}}}], "meta": {"offset": 1, "limit": null}}}
[INFO ] 2023-06-11 09:00:00.002-04:00 ResyApi$:88 - URL Request: https://api.resy.com/4/find?venue_id=834&party_size=4&long=0&day=2021-07-01&lat=0&                                                                                  
<skipping ahead a bit>
[INFO ] 2023-06-11 09:00:07.162-04:00 ResyApi$:88 - URL Request: https://api.resy.com/4/find?venue_id=834&party_size=4&long=0&day=2021-07-01&lat=0&                                                                                  
[INFO ] 2023-06-11 09:00:08.184-04:00 ResyClient:158 - URL Response: {"query": {"day": "2021-07-01", "party_size": 4}, "bookmark": null, "results": {"venues": [{"venue": {"id": {"resy": 834}, "venue_group": {"id": 624, "name": "Hogsalt Admin Group", "venues": [4242, 4244, 4408, 4411, 4412, 4473, 5769, 7294, 10294, 54602, 60058]}, "name": "4 Charles Prime Rib", "type": "Steakhouse", "url_slug": "4-charles-prime-rib", "price_range": 3, "average_bill_size":
 83.0, "currency_symbol": "$", "hospitality_included": 0, "resy_select": 0, "is_gdc": 0, "is_global_dining_access": false, "is_global_dining_access_only": false, "requires_reservation_transfers": 0, "is_gns": 0, "transaction_processor": "stripe", "hide_allergy_question": false, "hide_occasion_question": false, "hide_special_request_question": false, "gda_concierge_booking": false, "tax_included": false, "rating": 4.93117, "total_ratings": 21109, "invento
ry": {"type": {"id": 2}}, "reopen": {"date": "2020-08-25"}, "location": {"time_zone": "EST5EDT", "neighborhood": "West Village", "geo": {"lat": 40.735144, "lon": -74.000652}, "code": "ny", "name": "New York", "url_slug": null}, "travel_time": {"distance": 5391.248738710361}, "source": {"name": null, "logo": null, "terms_of_service": null, "privacy_policy": null}, "service_types": {}, "top": false, "ticket": {"average": 83.0, "average_str": "$83"}, "curre
ncy": {"symbol": "$", "code": "USD"}, "is_rga": false, "is_rga_only": false, "default_template": "829957", "responsive_images": {"originals": {"40417f593630d9082ffe353640349e13d715e0ab": {"url": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg"}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"url": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg"}, "8c58ed63bbdfdda229fb328a93cba65296594354":
 {"url": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg"}}, "urls": {"40417f593630d9082ffe353640349e13d715e0ab": {"1:1": {"200": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "1600": 
"https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/40417f59
3630d9082ffe353640349e13d715e0ab/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"1:1": {"200": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200", "400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7
bad018ba586f022f0833f234bb/jpg/1:1/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "1600": "https
://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/400", "800": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800", "1600": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"1:1": {"200": "
https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "4:3": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400"}, "16:9": {"400": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "urls_by_resolution": {"40417f593630d9082ffe353640349e13d715e0ab": {"200": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e
13d715e0ab/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/800", "4:3": "https://image
.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/1:1/1600", "4:3": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d715e0ab/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349
e13d715e0ab/jpg/16:9/1600"}}, "86bb3d879c75e7bad018ba586f022f0833f234bb": {"200": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/200"}, "400": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/400", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/400", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f02
2f0833f234bb/jpg/16:9/400"}, "800": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/800", "4:3": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/800", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/800"}, "1600": {"1:1": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/1:1/1600", "4:3": "https://
image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/4:3/1600", "16:9": "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/16:9/1600"}}, "8c58ed63bbdfdda229fb328a93cba65296594354": {"200": {"1:1": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/1:1/200"}, "400": {"4:3": "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/4:3/400", "16:9": "https
://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/16:9/400"}}}, "file_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "aspect_ratios": {"1:1": {"200": "200x200", "400": "400x400", "800": "800x800", "1600": "1600x1600"}, "4:3": {"400": "400x300", "800": "800x600", "1600": "1600x1200"}, "16:9": {"400": "400x225", "800": "800x450", "1600": 
"1600x900"}}}, "notify_options": [], "favorite": false, "waitlist": {"available": 0, "label": "Join Wait List", "current": null}, "supports_pickups": 0, "collections": [{"id": 883, "type_id": 1, "file_name": "winter", "image": "https://s3.amazonaws.com/resy.com/images/lists/winter.svg", "name": "New York\u2019s Essential Cozy Locales", "short_name": "Cozy Locales", "description": "Your new favorite apr\u00e8s-ski (sans the ski) locales \u2014 fireplace, 
snug corners, and heart-warming fare included."}, {"id": 1025, "type_id": 1, "file_name": "holiday", "image": "https://s3.amazonaws.com/resy.com/images/lists/holiday.svg", "name": "Where to Dine Out and Shop Small", "short_name": "Dine Small", "description": "It's time to revisit the restaurants we love. Shop Small\u00ae by visiting independent restaurants and small businesses you love. Featuring qualifying American Express-accepting restaurants."}, {"id
": 1089, "type_id": 1, "file_name": "chef-picks", "image": "https://s3.amazonaws.com/resy.com/images/lists/chef-picks.svg", "name": "Splurge-Worthy Dining in New York", "short_name": "Splurge Worthy", "description": "From blowout meals to special occasion dining, here are our favorite restaurants worth the price tag."}], "content": [{"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features on
e of the city\u2019s best burgers.", "display": {"type": "text"}, "icon": {"url": "https://s3.amazonaws.com/resy.com/images/icons/heart.svg"}, "locale": {"language": "en-us"}, "name": "why_we_like_it", "title": null}], "allow_bypass_payment_method": 1, "events": []}, "templates": {"829957": {"is_paid": false, "venue_share": null, "restriction_id": null, "payment_structure": null, "cancellation_fee": null, "secs_cancel_cut_off": null, "time_cancel_cut_off
": null, "secs_change_cut_off": null, "time_change_cut_off": null, "large_party_size_cancel": null, "large_party_cancellation_fee": null, "large_party_secs_cancel_cut_off": null, "large_party_time_cancel_cut_off": null, "large_party_secs_change_cut_off": null, "large_party_time_change_cut_off": null, "deposit_fee": null, "service_charge": null, "service_charge_options": [], "images": ["https://image.resy.com/3/003/2/834/40417f593630d9082ffe353640349e13d7
15e0ab/jpg/640x360", "https://image.resy.com/3/003/2/834/86bb3d879c75e7bad018ba586f022f0833f234bb/jpg/640x360", "https://image.resy.com/3/003/2/834/8c58ed63bbdfdda229fb328a93cba65296594354/jpg/640x360"], "raw_image_names": ["40417f593630d9082ffe353640349e13d715e0ab", "86bb3d879c75e7bad018ba586f022f0833f234bb", "8c58ed63bbdfdda229fb328a93cba65296594354"], "image_dimensions": [[1763, 1669], [1764, 1672], [640, 360]], "is_default": 1, "is_event": 0, "is_pic
kup": 0, "pickup_highlight": 0, "venue_id": 834, "reservation_config": {"badge": null, "type": "", "secs_off_market": null, "time_off_market": null}, "turn_times": [{"secs_amount": 5400, "size": {"max": 1, "min": 1}}, {"secs_amount": 5400, "size": {"max": 2, "min": 2}}, {"secs_amount": 5400, "size": {"max": 3, "min": 3}}, {"secs_amount": 5400, "size": {"max": 4, "min": 4}}, {"secs_amount": 5400, "size": {"max": null, "min": 5}}], "display_config": {"colo
r": {"background": null, "font": null}}, "content": {"en-us": {"about": {"attribution": null, "body": "4 Charles is an intimate supper club tucked away in the charming West Village. With crystal chandeliers, plush leather seating and paintings lining its dark wood walls, this late-night dining den winks at a lost era.  We welcome  friends, family, and regulars for gorgeous cuts of prime rib, fresh seafood, and strong drinks. We are currently accepting re
servations for indoor and outdoor dining. ", "title": null}, "need_to_know": {"attribution": null, "body": "Reservations are available up to 21 days in advance, with each new date becoming available at 9 AM.\n\nA $5 per person reservation fee will be added to all reservations. This is to secure your seats with us and does not go towards your final bill. Holiday fees may vary. Please note that we do also politely ask that reservations are booked true to s
ize including any children. Your party size is considered final once the reservation is booked, and decreasing your party size at any time is not permitted. Should you arrive with less guests, we will apply a $50 per person guest change fee. This fee is applied for all reductions in party size, for any reason. It will be added to the final check. Thank you for your consideration!", "title": "Need to Know"}, "tagline": {"attribution": null, "body": "Prime
 Rib, Fresh Seafood, Strong Drinks.", "title": null}, "why_we_like_it": {"attribution": null, "body": "For the swanky, supper club atmosphere and the indulgent, meat-centric menu that features one of the city\u2019s best burgers.", "title": null}}}, "id": 829957, "menu": {"en-us": ["Shrimp Cocktail (cocktail sauce, dijonnaise)", "American Cheeseburger", "Dry Aged Bone-In Ribeye Steak (22 oz, b\u00e9arnaise sauce, steak salt)", "Roast Prime Rib of Beef (1
2 hours slow roasted, salt crusted, USDA prime rib of beef with natural beef jus & horseradish cream)"]}, "name": "UPDATED_DEFAULT_TEMPLATE", "item_ids": [], "menu_ids": []}}, "slots": [], "notifies": [], "pickups": {"slots": [], "service_types": {}}}], "meta": {"offset": 1, "limit": null}}}
[INFO ] 2023-06-11 09:00:08.195-04:00 ResyClient:176 - Missed the shot!                                           
[INFO ] 2023-06-11 09:00:08.196-04:00 ResyClient:177 - ┻━┻ ︵ \(°□°)/ ︵ ┻━┻                                      
[INFO ] 2023-06-11 09:00:08.199-04:00 ResyClient:178 - Could not find any available reservations                  
[INFO ] 2023-06-11 09:00:08.200-04:00 ResyBookingBot$:53 - Shutting down Resy Booking Bot                         
2023-06-11 09:00:08,202 pool-31-thread-1 DEBUG Stopping LoggerContext[name=682e34bc, org.apache.logging.log4j.core.LoggerContext@8294d99]                                                                                            
2023-06-11 09:00:08,204 pool-31-thread-1 DEBUG Stopping LoggerContext[name=682e34bc, org.apache.logging.log4j.core.LoggerContext@8294d99]...                                                                                         
2023-06-11 09:00:08,212 pool-31-thread-1 DEBUG Shutting down OutputStreamManager SYSTEM_OUT.false.false                                                                                                                              
2023-06-11 09:00:08,212 pool-31-thread-1 DEBUG OutputStream closed                                                
2023-06-11 09:00:08,212 pool-31-thread-1 DEBUG Shut down OutputStreamManager SYSTEM_OUT.false.false, all resources released: true                                                                                                    
2023-06-11 09:00:08,213 pool-31-thread-1 DEBUG Appender Stdout stopped with status true                           
2023-06-11 09:00:08,213 pool-31-thread-1 DEBUG Stopped org.apache.logging.log4j.core.config.properties.PropertiesConfiguration@700642b2 OK                                                                                           
2023-06-11 09:00:08,213 pool-31-thread-1 DEBUG Stopped LoggerContext[name=682e34bc, org.apache.logging.log4j.core.LoggerContext@8294d99] with status true                                                                            
sbt:resy-booking-bot>                                                                                             
[info] shutting down sbt server                                                                                   

and config (not including keys)

############
# ResyKeys #
############
# Your user profile API key. Can be found once you're logged into Resy in most "api.resy.com" network
# calls (i.e. Try they "/find" API call when visiting a restaurant). Open your web console and look for a request header
# called "authorization".
# e.g.
# resyKeys.api-key="MY_API_KEY"
resyKeys.api-key="MYKEY"
# Your user profile authentication token when logging into Resy. Can be found once you're logged into
# Resy in most "api.resy.com" network calls (i.e. Try the "/find" API call when visiting a restaurant). Open your web
# console and look for a request header called "x-resy-auth-token".
# e.g.
# resyKeys.auth-token="MY_AUTH_TOKEN"
resyKeys.auth-token="MYAUTH"

######################
# ReservationDetails #
######################
# The date you want to make the reservation in YYYY-MM-DD format. This should be set to the day after the
# last available day with restaurant reservations as this is the day you want to snipe for a reservation once they
# become available.
# e.g.
# resDetails.date="2099-01-30"
resDetails.date="2021-07-01"
# Size of the party reservation
# e.g.
# resDetails.party-size=2
resDetails.party-size=4
# The unique identifier of the restaurant you want to make the reservation at. Can be found when viewing
# available reservations for a restaurant as a query parameter in the `/find` API call if you have the web console open.
# e.g.
# resDetails.venue-id=123
resDetails.venue-id=834
# Priority list of reservation times and table types. Time is in military time HH:MM:SS format. This
# allows full flexibility on your reservation preferences. For example, your priority order of reservations can be...
#   * 18:00 - Dining Room
#   * 18:00 - Patio
#   * 18:15
#   If you have no preference on table type, then simply don't set it and the bot will pick a reservation for that time
#   slot regardless of the table type.
# e.g.
# resDetails.res-time-types=[
#     {reservation-time="18:00:00", table-type="Dining Room"},
#     {reservation-time="18:00:00", table-type="Patio"},
#     {reservation-time="18:15:00"}
# ]
resDetails.res-time-types=[]

#############
# SnipeTime #
#############
# Hour of the day when reservations become available and when you want to snipe
# e.g.
# snipeTime.hours=9
snipeTime.hours=9
# Minute of the day when reservations become available and when you want to snipe
# e.g.
# snipeTime.minutes=0
snipeTime.minutes=0