Performance problems rarely come from the framework.
In production systems, slow APIs are usually caused by returning too much data, doing too much work synchronously, or asking the database to do things it was never designed to do efficiently.
After working on several high-traffic .NET applications, I’ve found that Web API performance boils down to a handful of fundamentals. Not clever tricks. Not premature optimization. Just good design choices applied consistently.
Let’s walk through what actually matters.
1. Optimize Database Queries
If your API is slow, start with the database. Before reaching for caching or scaling, make sure your queries are doing exactly what they need to — and nothing more.
Practical Database Optimization Techniques
Optimize queries and avoid unnecessary complexity
Avoid complex joins unless they are truly needed
Return only the columns you need — never SELECT *
Add indexes based on how queries are actually used
Indexes are powerful, but they’re not free. Over-indexing write-heavy tables can quickly become its own performance problem.
Example: Returning Only What You Need
Compare that to returning entire rows with dozens of unused columns. Less data means:
Faster reads
Less memory usage
Faster serialization
SELECT Id, FirstName, LastName, Email FROM Users WHERE IsActive = 1 ORDER BY LastName
Use Execution Plans (SQL Server)
When working with Microsoft SQL Server, one of the most effective tools is the Execution Plan in SQL Server Management Studio.
Execution plans help you identify:
Table scans
Missing or unused indexes
Expensive operators in a query
Before adding an index, fix the query. Often a small query rewrite delivers a bigger performance gain than any index ever will.
2. Minimize Response Data
The fastest API is the one that sends the least data. One of the most common mistakes in Web APIs is returning far more data than the client actually needs.
Paging Is Not Optional
Paging should be the default — not an afterthought.
In one application I worked on, a single API endpoint was expected to return up to 2,000 records. Even with a well-optimized query and proper indexing, performance was still an issue, because performance doesn’t stop at the database.
Even if the query is fast, the API still has to:
Materialize thousands of objects
Serialize them
Send them over the network
At that point, you’re no longer optimizing SQL — you’re fighting physics.
Example: Paged API Endpoint
Benefits of paging:
Protects your API
Protects your database
Protects your clients
[HttpGet] public async Task<IActionResult> GetUsers( int page = 1, int pageSize = 50) { var users = await _context.Users .Where(u => u.IsActive) .OrderBy(u => u.LastName) .Skip((page - 1) * pageSize) .Take(pageSize) .Select(u => new UserDto { Id = u.Id, FullName = $"{u.FirstName} {u.LastName}", Email = u.Email }) .ToListAsync();
return Ok(users); }
Return Only What You Need
Use DTOs instead of returning full entities (lightweight, immutable records instead of full classes)
Filter and sort at the database level
Avoid loading navigation properties you don’t need
Doing less work will always outperform doing more work faster.
Example: Using DTOs instead of Entities
DTOs allow you to:
Control payload size
Avoid lazy-loading traps
Decouple your API from your data model
public record UserDto( int Id, string FullName, string Email );
This simple practice prevents an entire category of performance issues.
Example: API Endpoint That Projects Directly to a DTO
Database Entity
Each property corresponds to a column in the User table in the database.
Id is typically the primary key.
The strings (FirstName, LastName, Email) map directly to VARCHAR / NVARCHAR columns.
= default! is a C# 8+ feature to disable nullable warnings, assuming the database column is non-nullable.
Roles might map to a many-to-many relationship (UserRoles join table).
LoginHistory might map to a one-to-many relationship.
These properties allow EF Core to automatically load related data if requested.
public class User { public int Id { get; set; } public string FirstName { get; set; } = default!; public string LastName { get; set; } = default!; public string Email { get; set; } = default!;
// Navigation properties you do NOT want to load public ICollection<Role> Roles { get; set; } = new List<Role>(); public ICollection<LoginHistory> LoginHistory { get; set; } = new List<LoginHistory>(); }
Data Transformation Object (DTO)
A DTO (Data Transfer Object) is a class or record that defines exactly what data your API returns. Unlike entities, DTOs:
Caching is one of the most powerful performance tools — but only when used intentionally.
Server-Side Caching Options
In-memory caching: Stored in application memory (e.g., IMemoryCache, Memcached)
Distributed caching: Stored externally (e.g., Redis). When your API runs on multiple instances, distributed caching (e.g., Redis) ensures all nodes share the same cached data.
If your API runs on multiple instances, distributed caching is usually the safer option.
Example: In-Memory Caching
Retrieves active users from the database, projecting them into lightweight UserDto objects and caching the result for five minutes to reduce repeated database queries and improve performance.
CDNs for static assets (Azure CDN, AWS CloudFront)
These layers reduce load before a request ever reaches your API.
4. Cache Invalidation (The Trade Off)
Caching is easy. Cache invalidation can be more complex.
Once data changes, you need to make sure stale data doesn’t stick around.
Common approaches include:
Time-based expiration: Let the cache invalidate itself after a fixed period The challenge is choosing the right expiration time
Programmatic invalidation: Remove cache entries when updates occur The challenge is identifying every scenario where data should be invalidated
There’s no universal solution here — only tradeoffs.
Example: Programmatic Invalidation
This works well — but only if you identify every scenario where the cache should be invalidated.
_cache.Remove("active_users");
5. Use Asynchronous Processing for Long-Running Work
Not every request needs to finish its work before returning a response.
Asynchronous processing allows your API to:
Receive a request
Acknowledge it immediately
Process the work in the background
This keeps your API responsive and prevents clients from waiting on long-running tasks.
Common Approaches
Background jobs (Hangfire, Quartz.NET)
Message queues (Azure Service Bus, RabbitMQ, Apache Kafka)
Serverless workers (Azure Functions)
APIs don’t always need to do the work — sometimes they just need to start it.
Example: Background Job with Hangfire
Hangfire is ideal when you want reliable background processing without introducing additional infrastructure.
The API responds immediately (202 Accepted)
The request thread is released
The work runs reliably in the background
Jobs survive app restarts
API Controller — Accept and Return Immediately
[HttpPost("reports")] public IActionResult GenerateReport([FromBody] ReportRequest request) { BackgroundJob.Enqueue<IReportService>( service => service.GenerateReportAsync(request));
return Accepted("Report generation has started."); }
Background Job Service
public interface IReportService { Task GenerateReportAsync(ReportRequest request); }
public class ReportService : IReportService { public async Task GenerateReportAsync(ReportRequest request) { // Simulate long-running work await Task.Delay(TimeSpan.FromSeconds(10));
// Generate report, store file, send notification, etc. } }
Example: Message Queue (Azure Service Bus / RabbitMQ)
return Accepted("Order received for processing."); }
Message Consumer — Separate Worker Service
public class OrderCreatedHandler { public async Task HandleAsync(OrderCreatedMessage message) { // Long-running processing await ProcessOrderAsync(message.OrderId); } }
Example: Azure Functions as a Background Worker
This is perfect when you want zero infrastructure management.
Why This Is Powerful
Scales automatically
No background services to manage
Excellent for burst workloads
API — Send Message to Service Bus
[HttpPost("emails")] public async Task<IActionResult> SendEmail([FromBody] EmailRequest request) { await _serviceBusSender.SendMessageAsync( new ServiceBusMessage(JsonSerializer.Serialize(request)));
return Accepted("Email queued for delivery."); }
Azure Function — Process the Message
public class EmailProcessor { [FunctionName("EmailProcessor")] public async Task Run( [ServiceBusTrigger("email-queue")] EmailRequest request) { await SendEmailAsync(request); } }
Example: What Not to Do
Why?
Work can be killed if the app restarts
No retries
No observability
Not suitable for production APIs
Task.Run(() => DoWorkAsync());
6. Scale When Code Isn’t Enough
Eventually, you’ll hit a point where software optimizations alone aren’t sufficient.
That’s when scaling becomes necessary.
Load Balancing and Auto-Scaling
Run multiple API instances
Use a load balancer to distribute traffic
Enable auto-scaling to handle traffic spikes
Modern cloud platforms make this much easier than it used to be. Scale up during peak traffic, scale down when demand drops, and only pay for what you use.
Scaling won’t fix inefficient code — but it can significantly improve reliability and throughput once the fundamentals are in place.
Make your API Stateless (Required for Scaling)
❌ Example: What Breaks Scaling
Static or in-memory state ties requests to a single instance.
public class OrderController : ControllerBase { private static List<Order> _orders = new(); }
✅ Use External State Instead
Externalize state to:
Databases
Distributed cache (Redis)
Message queues
public class OrderController : ControllerBase { private readonly IDistributedCache _cache;
public OrderController(IDistributedCache cache) { _cache = cache; } }
{"id":"2","mode":"button","open_style":"in_modal","currency_code":"USD","currency_symbol":"$","currency_type":"decimal","blank_flag_url":"https:\/\/robhutton.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/robhutton.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":500,"top_media_type":"featured_image","featured_image_url":"https:\/\/robhutton.com\/wp-content\/uploads\/Screenshot-2025-02-19-163019-100x74.png","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":false,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"robhutton.com","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"robhutton.com","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for being a supporter!","payment_confirmation_title":"robhutton.com","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":"Voluntary nature: Tips are non-refundable and given voluntarily. No goods\/services in exchange: Tipping doesn\u2019t entitle the user to any product, service, or preferential treatment. Payment processing: Mention that payments are processed securely through a third-party provider. No liability: You aren\u2019t responsible for transaction failures, fraud, or technical issues.","terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
{"id":"4","mode":"text_link","open_style":"in_modal","currency_code":"USD","currency_symbol":"$","currency_type":"decimal","blank_flag_url":"https:\/\/robhutton.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/robhutton.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":500,"top_media_type":"featured_image","featured_image_url":"https:\/\/robhutton.com\/wp-content\/uploads\/Screenshot-2025-02-19-163019-100x74.png","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Like my articles? Tips are appreciated.","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for being a supporter!","payment_confirmation_title":"","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":"Voluntary nature: Tips are non-refundable and given voluntarily. No goods\/services in exchange: Tipping doesn\u2019t entitle the user to any product, service, or preferential treatment. Payment processing: Mention that payments are processed securely through a third-party provider. No liability: You aren\u2019t responsible for transaction failures, fraud, or technical issues.","terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}